Skip to content

Commit 8dc92cf

Browse files
author
Artur Zakirov
committed
dirty XLog fixes
1 parent d7d92b4 commit 8dc92cf

File tree

4 files changed

+47
-46
lines changed

4 files changed

+47
-46
lines changed

rum.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ extern bytea *rumoptions(Datum reloptions, bool validate);
506506
extern Datum rumhandler(PG_FUNCTION_ARGS);
507507
extern void initRumState(RumState *state, Relation index);
508508
extern Buffer RumNewBuffer(Relation index);
509-
extern void RumInitBuffer(Relation index, Buffer buffer, uint32 flags);
509+
extern void RumInitBuffer(Buffer buffer, uint32 flags);
510510
extern void RumInitPage(Page page, uint32 f, Size pageSize);
511511
extern void RumInitMetabuffer(Relation index, Buffer metaBuffer);
512512
extern int rumCompareEntries(RumState *rumstate, OffsetNumber attnum,

rumfast.c

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,27 @@ typedef struct KeyArray
4646
* Returns amount of free space left on the page.
4747
*/
4848
static int32
49-
writeListPage(Relation index, Buffer buffer,
49+
writeListPage(Relation index, Buffer buffer, GenericXLogState *state,
5050
IndexTuple *tuples, int32 ntuples, BlockNumber rightlink)
5151
{
52-
Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
52+
Page page;
5353
int32 i,
5454
freesize,
5555
size = 0;
5656
OffsetNumber l,
5757
off;
5858
char *workspace;
5959
char *ptr;
60+
GenericXLogState *state2;
6061

62+
state2 = GenericXLogStart(index);
6163
/* workspace could be a local array; we use palloc for alignment */
6264
workspace = palloc(BLCKSZ);
6365

6466
START_CRIT_SECTION();
6567

66-
RumInitBuffer(index, buffer, RUM_LIST);
68+
RumInitBuffer(buffer, RUM_LIST);
69+
page = GenericXLogRegisterBuffer(state2, buffer, 0);
6770

6871
off = FirstOffsetNumber;
6972
ptr = workspace;
@@ -104,7 +107,8 @@ writeListPage(Relation index, Buffer buffer,
104107
RumPageGetOpaque(page)->maxoff = 0;
105108
}
106109

107-
MarkBufferDirty(buffer);
110+
// MarkBufferDirty(buffer);
111+
GenericXLogFinish(state2);
108112

109113
/* get free space before releasing buffer */
110114
freesize = PageGetExactFreeSpace(page);
@@ -119,8 +123,8 @@ writeListPage(Relation index, Buffer buffer,
119123
}
120124

121125
static void
122-
makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
123-
RumMetaPageData *res)
126+
makeSublist(Relation index, GenericXLogState *state,
127+
IndexTuple *tuples, int32 ntuples, RumMetaPageData *res)
124128
{
125129
Buffer curBuffer = InvalidBuffer;
126130
Buffer prevBuffer = InvalidBuffer;
@@ -143,7 +147,7 @@ makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
143147
if (prevBuffer != InvalidBuffer)
144148
{
145149
res->nPendingPages++;
146-
writeListPage(index, prevBuffer,
150+
writeListPage(index, prevBuffer, state,
147151
tuples + startTuple,
148152
i - startTuple,
149153
BufferGetBlockNumber(curBuffer));
@@ -176,7 +180,7 @@ makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
176180
* Write last page
177181
*/
178182
res->tail = BufferGetBlockNumber(curBuffer);
179-
res->tailFreeSize = writeListPage(index, curBuffer,
183+
res->tailFreeSize = writeListPage(index, curBuffer, state,
180184
tuples + startTuple,
181185
ntuples - startTuple,
182186
InvalidBlockNumber);
@@ -199,7 +203,7 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
199203
Buffer metabuffer;
200204
Page metapage;
201205
RumMetaPageData *metadata = NULL;
202-
RumXLogRecData rdata[2];
206+
// RumXLogRecData rdata[2];
203207
Buffer buffer = InvalidBuffer;
204208
Page page = NULL;
205209
rumxlogUpdateMeta data;
@@ -214,10 +218,10 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
214218
data.ntuples = 0;
215219
data.newRightlink = data.prevTail = InvalidBlockNumber;
216220

217-
rdata[0].buffer = InvalidBuffer;
218-
rdata[0].data = (char *) &data;
219-
rdata[0].len = sizeof(rumxlogUpdateMeta);
220-
rdata[0].next = NULL;
221+
// rdata[0].buffer = InvalidBuffer;
222+
// rdata[0].data = (char *) &data;
223+
// rdata[0].len = sizeof(rumxlogUpdateMeta);
224+
// rdata[0].next = NULL;
221225

222226
state = GenericXLogStart(rumstate->index);
223227
metabuffer = ReadBuffer(index, RUM_METAPAGE_BLKNO);
@@ -257,7 +261,8 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
257261
RumMetaPageData sublist;
258262

259263
memset(&sublist, 0, sizeof(RumMetaPageData));
260-
makeSublist(index, collector->tuples, collector->ntuples, &sublist);
264+
makeSublist(index, state,
265+
collector->tuples, collector->ntuples, &sublist);
261266

262267
/*
263268
* metapage was unlocked, see above
@@ -291,21 +296,21 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
291296
LockBuffer(buffer, RUM_EXCLUSIVE);
292297
page = GenericXLogRegisterBuffer(state, buffer, 0);
293298

294-
rdata[0].next = rdata + 1;
295-
296-
rdata[1].buffer = buffer;
297-
rdata[1].buffer_std = true;
298-
rdata[1].data = NULL;
299-
rdata[1].len = 0;
300-
rdata[1].next = NULL;
299+
// rdata[0].next = rdata + 1;
300+
//
301+
// rdata[1].buffer = buffer;
302+
// rdata[1].buffer_std = true;
303+
// rdata[1].data = NULL;
304+
// rdata[1].len = 0;
305+
// rdata[1].next = NULL;
301306

302307
Assert(RumPageGetOpaque(page)->rightlink == InvalidBlockNumber);
303308

304309
START_CRIT_SECTION();
305310

306311
RumPageGetOpaque(page)->rightlink = sublist.head;
307312

308-
MarkBufferDirty(buffer);
313+
// MarkBufferDirty(buffer);
309314

310315
metadata->tail = sublist.tail;
311316
metadata->tailFreeSize = sublist.tailFreeSize;
@@ -332,13 +337,13 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
332337
off = (PageIsEmpty(page)) ? FirstOffsetNumber :
333338
OffsetNumberNext(PageGetMaxOffsetNumber(page));
334339

335-
rdata[0].next = rdata + 1;
336-
337-
rdata[1].buffer = buffer;
338-
rdata[1].buffer_std = true;
339-
ptr = rdata[1].data = (char *) palloc(collector->sumsize);
340-
rdata[1].len = collector->sumsize;
341-
rdata[1].next = NULL;
340+
// rdata[0].next = rdata + 1;
341+
//
342+
// rdata[1].buffer = buffer;
343+
// rdata[1].buffer_std = true;
344+
ptr /*= rdata[1].data*/ = (char *) palloc(collector->sumsize);
345+
// rdata[1].len = collector->sumsize;
346+
// rdata[1].next = NULL;
342347

343348
data.ntuples = collector->ntuples;
344349

@@ -357,26 +362,29 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
357362
l = PageAddItem(page, (Item) collector->tuples[i], tupsize, off, false, false);
358363

359364
if (l == InvalidOffsetNumber)
365+
{
366+
GenericXLogAbort(state);
360367
elog(ERROR, "failed to add item to index page in \"%s\"",
361368
RelationGetRelationName(index));
369+
}
362370

363371
memcpy(ptr, collector->tuples[i], tupsize);
364372
ptr += tupsize;
365373

366374
off++;
367375
}
368376

369-
Assert((ptr - rdata[1].data) <= collector->sumsize);
377+
// Assert((ptr - rdata[1].data) <= collector->sumsize);
370378

371379
metadata->tailFreeSize = PageGetExactFreeSpace(page);
372380

373-
MarkBufferDirty(buffer);
381+
// MarkBufferDirty(buffer);
374382
}
375383

376384
/*
377385
* Write metabuffer, make xlog entry
378386
*/
379-
MarkBufferDirty(metabuffer);
387+
// MarkBufferDirty(metabuffer);
380388

381389
GenericXLogFinish(state);
382390

ruminsert.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ createPostingTree(RumState *rumstate, OffsetNumber attnum, Relation index,
5858

5959
START_CRIT_SECTION();
6060

61-
RumInitBuffer(index, buffer, RUM_DATA | RUM_LEAF);
61+
RumInitBuffer(buffer, RUM_DATA | RUM_LEAF);
6262
page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
6363
blkno = BufferGetBlockNumber(buffer);
6464

@@ -615,7 +615,7 @@ rumbuild(Relation heap, Relation index, struct IndexInfo *indexInfo)
615615
RootBuffer = RumNewBuffer(index);
616616

617617
RumInitMetabuffer(index, MetaBuffer);
618-
RumInitBuffer(index, RootBuffer, RUM_LEAF);
618+
RumInitBuffer(RootBuffer, RUM_LEAF);
619619

620620
UnlockReleaseBuffer(MetaBuffer);
621621
UnlockReleaseBuffer(RootBuffer);
@@ -713,7 +713,7 @@ rumbuildempty(Relation index)
713713
/* Initialize and xlog metabuffer and root buffer. */
714714
RumInitMetabuffer(index, MetaBuffer);
715715

716-
RumInitBuffer(index, RootBuffer, RUM_LEAF);
716+
RumInitBuffer(RootBuffer, RUM_LEAF);
717717

718718
/* Unlock and release the buffers. */
719719
UnlockReleaseBuffer(MetaBuffer);

rumutil.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,10 @@ RumInitPage(Page page, uint32 f, Size pageSize)
389389
}
390390

391391
void
392-
RumInitBuffer(Relation index, Buffer buffer, uint32 flags)
392+
RumInitBuffer(Buffer buffer, uint32 flags)
393393
{
394-
Page page;
395-
GenericXLogState *state;
396-
397-
state = GenericXLogStart(index);
398-
page = GenericXLogRegisterBuffer(state, buffer, GENERIC_XLOG_FULL_IMAGE);
399-
400-
RumInitPage(page, flags, BufferGetPageSize(buffer));
401-
402-
GenericXLogFinish(state);
394+
RumInitPage(BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST),
395+
flags, BufferGetPageSize(buffer));
403396
}
404397

405398
void

0 commit comments

Comments
 (0)