[Groonga-commit] pgroonga/pgroonga at 76ed2a5 [master] wal: use linpN space instead of special space

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Nov 3 23:04:40 JST 2016


Kouhei Sutou	2016-11-03 23:04:40 +0900 (Thu, 03 Nov 2016)

  New Revision: 76ed2a52bcff598ddbd181953bd27f36346f5723
  https://github.com/pgroonga/pgroonga/commit/76ed2a52bcff598ddbd181953bd27f36346f5723

  Message:
    wal: use linpN space instead of special space

  Modified files:
    src/pgrn_index_status.c
    src/pgrn_index_status.h
    src/pgrn_wal.c

  Modified: src/pgrn_index_status.c (+3 -3)
===================================================================
--- src/pgrn_index_status.c    2016-11-03 18:03:11 +0900 (8028d3b)
+++ src/pgrn_index_status.c    2016-11-03 23:04:40 +0900 (78d15ee)
@@ -119,7 +119,7 @@ PGrnIndexStatusSetMaxRecordSize(Relation index, uint32_t size)
 void
 PGrnIndexStatusGetWALAppliedPosition(Relation index,
 									 BlockNumber *block,
-									 OffsetNumber *offset)
+									 LocationIndex *offset)
 {
 	grn_id id;
 	grn_obj *column;
@@ -133,13 +133,13 @@ PGrnIndexStatusGetWALAppliedPosition(Relation index,
 	grn_obj_get_value(ctx, column, id, position);
 	positionRaw = GRN_UINT64_VALUE(position);
 	*block = (BlockNumber)(positionRaw >> 32);
-	*offset = (OffsetNumber)(positionRaw & ((1 << 16) - 1));
+	*offset = (LocationIndex)(positionRaw & ((1 << 16) - 1));
 }
 
 void
 PGrnIndexStatusSetWALAppliedPosition(Relation index,
 									 BlockNumber block,
-									 OffsetNumber offset)
+									 LocationIndex offset)
 {
 	grn_id id;
 	grn_obj *column;

  Modified: src/pgrn_index_status.h (+3 -3)
===================================================================
--- src/pgrn_index_status.h    2016-11-03 18:03:11 +0900 (274a55d)
+++ src/pgrn_index_status.h    2016-11-03 23:04:40 +0900 (32da1a8)
@@ -1,7 +1,7 @@
 #pragma once
 
 #include <postgres.h>
-#include <storage/off.h>
+#include <storage/bufpage.h>
 #include <utils/rel.h>
 
 #include <groonga.h>
@@ -13,7 +13,7 @@ void PGrnIndexStatusSetMaxRecordSize(Relation index, uint32_t size);
 
 void PGrnIndexStatusGetWALAppliedPosition(Relation index,
 										  BlockNumber *block,
-										  OffsetNumber *offset);
+										  LocationIndex *offset);
 void PGrnIndexStatusSetWALAppliedPosition(Relation index,
 										  BlockNumber block,
-										  OffsetNumber offset);
+										  LocationIndex offset);

  Modified: src/pgrn_wal.c (+55 -47)
===================================================================
--- src/pgrn_wal.c    2016-11-03 18:03:11 +0900 (39810e3)
+++ src/pgrn_wal.c    2016-11-03 23:04:40 +0900 (028bfa3)
@@ -58,19 +58,11 @@ typedef struct {
 	uint8_t version;
 } PGrnWALMetaPageSpecial;
 
-#define PGRN_PAGE_DATA_SIZE										\
-	(BLCKSZ - SizeOfPageHeaderData - sizeof(OffsetNumber) - 1)
-typedef struct {
-	OffsetNumber current;
-	uint8_t data[PGRN_PAGE_DATA_SIZE];
-} PGrnWALPageSpecial;
-
 typedef struct {
 	GenericXLogState *state;
 	PGrnWALMetaPageSpecial *metaPageSpecial;
 	Buffer buffer;
 	Page page;
-	PGrnWALPageSpecial *special;
 } PGrnWALPageWriteData;
 #endif
 
@@ -90,7 +82,6 @@ struct PGrnWALData_
 	{
 		Buffer buffer;
 		Page page;
-		PGrnWALPageSpecial *pageSpecial;
 	} current;
 	msgpack_packer packer;
 #endif
@@ -173,7 +164,6 @@ PGrnWALDataInitCurrent(PGrnWALData *data)
 {
 	data->current.buffer = InvalidBuffer;
 	data->current.page = NULL;
-	data->current.pageSpecial = NULL;
 }
 
 static void
@@ -193,6 +183,42 @@ PGrnWALDataRestart(PGrnWALData *data)
 	PGrnWALDataInitCurrent(data);
 }
 
+static char *
+PGrnWALPageGetData(Page page)
+{
+	return PageGetContents(page);
+}
+
+static size_t
+PGrnWALPageGetFreeSize(Page page)
+{
+	PageHeader pageHeader;
+
+	pageHeader = (PageHeader)page;
+	return pageHeader->pd_upper - pageHeader->pd_lower;
+}
+
+static LocationIndex
+PGrnWALPageGetLastOffset(Page page)
+{
+	PageHeader pageHeader;
+
+	pageHeader = (PageHeader)page;
+	return pageHeader->pd_lower - SizeOfPageHeaderData;
+}
+
+static void
+PGrnWALPageAppend(Page page, const char *data, size_t dataSize)
+{
+	PageHeader pageHeader;
+
+	pageHeader = (PageHeader)page;
+	memcpy(PGrnWALPageGetData(page) + PGrnWALPageGetLastOffset(page),
+		   data,
+		   dataSize);
+	pageHeader->pd_lower += dataSize;
+}
+
 static void
 PGrnWALPageWriterEnsureCurrent(PGrnWALData *data)
 {
@@ -221,10 +247,7 @@ PGrnWALPageWriterEnsureCurrent(PGrnWALData *data)
 			GenericXLogRegisterBuffer(data->state,
 									  data->current.buffer,
 									  GENERIC_XLOG_FULL_IMAGE);
-		PageInit(data->current.page, BLCKSZ, sizeof(PGrnWALPageSpecial));
-		data->current.pageSpecial =
-			(PGrnWALPageSpecial *)PageGetSpecialPointer(data->current.page);
-		data->current.pageSpecial->current = 0;
+		PageInit(data->current.page, BLCKSZ, 0);
 	}
 	else
 	{
@@ -235,8 +258,6 @@ PGrnWALPageWriterEnsureCurrent(PGrnWALData *data)
 			GenericXLogRegisterBuffer(data->state,
 									  data->current.buffer,
 									  0);
-		data->current.pageSpecial =
-			(PGrnWALPageSpecial *)PageGetSpecialPointer(data->current.page);
 	}
 
 	data->nUsedPages++;
@@ -253,35 +274,26 @@ PGrnWALPageWriter(void *userData,
 
 	while (written < length)
 	{
+		size_t freeSize;
+
 		PGrnWALPageWriterEnsureCurrent(data);
 
-		if (data->current.pageSpecial->current + rest <= PGRN_PAGE_DATA_SIZE)
+		freeSize = PGrnWALPageGetFreeSize(data->current.page);
+		if (rest <= freeSize)
 		{
-			memcpy(data->current.pageSpecial->data +
-				   data->current.pageSpecial->current,
-				   buffer,
-				   rest);
-			data->current.pageSpecial->current += rest;
+			PGrnWALPageAppend(data->current.page, buffer, rest);
 			PGrnIndexStatusSetWALAppliedPosition(
 				data->index,
 				BufferGetBlockNumber(data->current.buffer),
-				data->current.pageSpecial->current);
+				PGrnWALPageGetLastOffset(data->current.page));
 			written += rest;
 		}
 		else
 		{
-			size_t writableSize;
-
-			writableSize =
-				PGRN_PAGE_DATA_SIZE - data->current.pageSpecial->current;
-			memcpy(data->current.pageSpecial->data +
-				   data->current.pageSpecial->current,
-				   buffer,
-				   writableSize);
-			data->current.pageSpecial->current += writableSize;
-			written += writableSize;
-			rest -= writableSize;
-			buffer += writableSize;
+			PGrnWALPageAppend(data->current.page, buffer, freeSize);
+			written += freeSize;
+			rest -= freeSize;
+			buffer += freeSize;
 
 			data->current.page = NULL;
 			UnlockReleaseBuffer(data->current.buffer);
@@ -797,7 +809,7 @@ typedef struct {
 	Relation index;
 	struct {
 		BlockNumber block;
-		OffsetNumber offset;
+		LocationIndex offset;
 	} current;
 	grn_obj *sources;
 } PGrnWALApplyData;
@@ -806,7 +818,7 @@ static bool
 PGrnWALApplyNeeded(PGrnWALApplyData *data)
 {
 	BlockNumber currentBlock;
-	OffsetNumber currentOffset;
+	LocationIndex currentOffset;
 	BlockNumber nBlocks;
 
 	PGrnIndexStatusGetWALAppliedPosition(data->index,
@@ -822,14 +834,12 @@ PGrnWALApplyNeeded(PGrnWALApplyData *data)
 	{
 		Buffer buffer;
 		Page page;
-		PGrnWALPageSpecial *pageSpecial;
 		bool needToApply;
 
 		buffer = ReadBuffer(data->index, currentBlock);
 		LockBuffer(buffer, BUFFER_LOCK_SHARE);
 		page = BufferGetPage(buffer);
-		pageSpecial = (PGrnWALPageSpecial *)PageGetSpecialPointer(page);
-		needToApply = (pageSpecial->current > currentOffset);
+		needToApply = (PGrnWALPageGetLastOffset(page) > currentOffset);
 		UnlockReleaseBuffer(buffer);
 		return needToApply;
 	} else {
@@ -1379,12 +1389,12 @@ PGrnWALApplyConsume(PGrnWALApplyData *data)
 {
 	BlockNumber i;
 	BlockNumber startBlock;
-	OffsetNumber dataOffset;
+	LocationIndex dataOffset;
 	BlockNumber nBlocks;
 	msgpack_unpacker unpacker;
 	msgpack_unpacked unpacked;
 
-	msgpack_unpacker_init(&unpacker, PGRN_PAGE_DATA_SIZE);
+	msgpack_unpacker_init(&unpacker, MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
 	msgpack_unpacked_init(&unpacked);
 	startBlock = data->current.block;
 	dataOffset = data->current.offset;
@@ -1395,17 +1405,15 @@ PGrnWALApplyConsume(PGrnWALApplyData *data)
 	{
 		Buffer buffer;
 		Page page;
-		PGrnWALPageSpecial *pageSpecial;
 		size_t dataSize;
 
 		buffer = ReadBuffer(data->index, i);
 		LockBuffer(buffer, BUFFER_LOCK_SHARE);
 		page = BufferGetPage(buffer);
-		pageSpecial = (PGrnWALPageSpecial *)PageGetSpecialPointer(page);
-		dataSize = pageSpecial->current - dataOffset;
+		dataSize = PGrnWALPageGetLastOffset(page) - dataOffset;
 		msgpack_unpacker_reserve_buffer(&unpacker, dataSize);
 		memcpy(msgpack_unpacker_buffer(&unpacker),
-			   pageSpecial->data + dataOffset,
+			   PGrnWALPageGetData(page) + dataOffset,
 			   dataSize);
 		UnlockReleaseBuffer(buffer);
 
@@ -1413,7 +1421,7 @@ PGrnWALApplyConsume(PGrnWALApplyData *data)
 		while (msgpack_unpacker_next(&unpacker, &unpacked) ==
 			   MSGPACK_UNPACK_SUCCESS)
 		{
-			OffsetNumber appliedOffset;
+			LocationIndex appliedOffset;
 
 			PGrnWALApplyObject(data, &unpacked.data);
 			appliedOffset =
-------------- next part --------------
HTML����������������������������...
Download 



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