[Groonga-commit] pgroonga/pgroonga at 735b0a6 [master] wal: support large (8KiB * 3 or more) data

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Nov 3 16:36:09 JST 2016


Kouhei Sutou	2016-11-03 16:36:09 +0900 (Thu, 03 Nov 2016)

  New Revision: 735b0a6000f0834b3f60a02169f9154b7ca256f1
  https://github.com/pgroonga/pgroonga/commit/735b0a6000f0834b3f60a02169f9154b7ca256f1

  Message:
    wal: support large (8KiB * 3 or more) data

  Modified files:
    src/pgrn_wal.c

  Modified: src/pgrn_wal.c (+33 -0)
===================================================================
--- src/pgrn_wal.c    2016-11-03 16:33:58 +0900 (9563cb6)
+++ src/pgrn_wal.c    2016-11-03 16:36:09 +0900 (56b869f)
@@ -79,6 +79,7 @@ struct PGrnWALData_
 	Relation index;
 #ifdef PGRN_SUPPORT_WAL
 	GenericXLogState *state;
+	unsigned int nUsedPages;
 	struct
 	{
 		Buffer buffer;
@@ -128,6 +129,12 @@ msgpack_pack_grn_obj(msgpack_packer *packer, grn_obj *object)
 
 #ifdef PGRN_SUPPORT_WAL
 static void
+PGrnWALDataInitNUsedPages(PGrnWALData *data)
+{
+	data->nUsedPages = 1; /* meta page */
+}
+
+static void
 PGrnWALDataInitMeta(PGrnWALData *data)
 {
 	if (RelationGetNumberOfBlocks(data->index) == 0)
@@ -170,6 +177,23 @@ PGrnWALDataInitCurrent(PGrnWALData *data)
 }
 
 static void
+PGrnWALDataRestart(PGrnWALData *data)
+{
+	GenericXLogFinish(data->state);
+
+	if (data->current.buffer)
+	{
+		UnlockReleaseBuffer(data->current.buffer);
+	}
+	UnlockReleaseBuffer(data->meta.buffer);
+
+	data->state = GenericXLogStart(data->index);
+	PGrnWALDataInitNUsedPages(data);
+	PGrnWALDataInitMeta(data);
+	PGrnWALDataInitCurrent(data);
+}
+
+static void
 PGrnWALPageWriterEnsureCurrent(PGrnWALData *data)
 {
 	PGrnWALMetaPageSpecial *meta;
@@ -177,6 +201,12 @@ PGrnWALPageWriterEnsureCurrent(PGrnWALData *data)
 	if (!BufferIsInvalid(data->current.buffer))
 		return;
 
+	if (RelationGetNumberOfBlocks(data->index) <= data->meta.pageSpecial->next &&
+		data->nUsedPages == MAX_GENERIC_XLOG_PAGES)
+	{
+		PGrnWALDataRestart(data);
+	}
+
 	meta = data->meta.pageSpecial;
 	if (RelationGetNumberOfBlocks(data->index) <= meta->next)
 	{
@@ -208,6 +238,8 @@ PGrnWALPageWriterEnsureCurrent(PGrnWALData *data)
 		data->current.pageSpecial =
 			(PGrnWALPageSpecial *)PageGetSpecialPointer(data->current.page);
 	}
+
+	data->nUsedPages++;
 }
 
 static int
@@ -285,6 +317,7 @@ PGrnWALStart(Relation index)
 	data->index = index;
 	data->state = GenericXLogStart(data->index);
 
+	PGrnWALDataInitNUsedPages(data);
 	PGrnWALDataInitMeta(data);
 	PGrnWALDataInitCurrent(data);
 	PGrnWALDataInitMessagePack(data);
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index