PostgreSQL Source Code: src/backend/access/gist/gistxlog.c File Reference (original) (raw)
Go to the source code of this file.
◆ decodePageSplitRecord()
static IndexTuple * decodePageSplitRecord ( char * begin, int len, int * n ) | static |
---|
Definition at line 223 of file gistxlog.c.
224{
225 char *ptr;
226 int i = 0;
228
229
230 memcpy(n, begin, sizeof(int));
231 ptr = begin + sizeof(int);
232
234
236 {
240 }
242
243 return tuples;
244}
Assert(PointerIsAligned(start, uint64))
IndexTupleData * IndexTuple
static Size IndexTupleSize(const IndexTupleData *itup)
References Assert(), i, IndexTupleSize(), len, and palloc().
Referenced by gistRedoPageSplitRecord().
◆ gist_mask()
◆ gist_redo()
Definition at line 397 of file gistxlog.c.
398{
401
402
403
404
405
406
407
409 switch (info)
410 {
413 break;
416 break;
419 break;
422 break;
425 break;
427
428 break;
429 default:
430 elog(PANIC, "gist_redo: unknown op code %u", info);
431 }
432
435}
static void gistRedoPageReuse(XLogReaderState *record)
static void gistRedoPageUpdateRecord(XLogReaderState *record)
static void gistRedoPageSplitRecord(XLogReaderState *record)
static void gistRedoPageDelete(XLogReaderState *record)
static void gistRedoDeleteRecord(XLogReaderState *record)
static MemoryContext opCtx
#define XLOG_GIST_ASSIGN_LSN
#define XLOG_GIST_PAGE_REUSE
#define XLOG_GIST_PAGE_DELETE
#define XLOG_GIST_PAGE_SPLIT
#define XLOG_GIST_PAGE_UPDATE
void MemoryContextReset(MemoryContext context)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define XLogRecGetInfo(decoder)
References elog, gistRedoDeleteRecord(), gistRedoPageDelete(), gistRedoPageReuse(), gistRedoPageSplitRecord(), gistRedoPageUpdateRecord(), MemoryContextReset(), MemoryContextSwitchTo(), opCtx, PANIC, XLOG_GIST_ASSIGN_LSN, XLOG_GIST_DELETE, XLOG_GIST_PAGE_DELETE, XLOG_GIST_PAGE_REUSE, XLOG_GIST_PAGE_SPLIT, XLOG_GIST_PAGE_UPDATE, and XLogRecGetInfo.
◆ gist_xlog_cleanup()
void gist_xlog_cleanup | ( | void | ) |
---|
◆ gist_xlog_startup()
void gist_xlog_startup | ( | void | ) |
---|
◆ gistRedoClearFollowRight()
Definition at line 40 of file gistxlog.c.
41{
46
47
48
49
50
53 {
55
58
61 }
64}
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define GistClearFollowRight(page)
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
References generate_unaccent_rules::action, BLK_NEEDS_REDO, BLK_RESTORED, BufferGetPage(), BufferIsValid(), XLogReaderState::EndRecPtr, GistClearFollowRight, GistPageSetNSN, MarkBufferDirty(), PageSetLSN(), UnlockReleaseBuffer(), and XLogReadBufferForRedo().
Referenced by gistRedoPageSplitRecord(), and gistRedoPageUpdateRecord().
◆ gistRedoDeleteRecord()
Definition at line 172 of file gistxlog.c.
173{
179
180
181
182
183
184
185
186
187
188
189
190
192 {
194
196
199 rlocator);
200 }
201
203 {
205
207
210
213 }
214
217}
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
#define GistMarkTuplesDeleted(page)
void ResolveRecoveryConflictWithSnapshot(TransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
TransactionId snapshotConflictHorizon
OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]
void XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
#define XLogRecGetData(decoder)
References BLK_NEEDS_REDO, BufferGetPage(), BufferIsValid(), XLogReaderState::EndRecPtr, GistClearPageHasGarbage, GistMarkTuplesDeleted, InHotStandby, gistxlogDelete::isCatalogRel, MarkBufferDirty(), gistxlogDelete::ntodelete, gistxlogDelete::offsets, PageIndexMultiDelete(), PageSetLSN(), ResolveRecoveryConflictWithSnapshot(), gistxlogDelete::snapshotConflictHorizon, UnlockReleaseBuffer(), XLogReadBufferForRedo(), XLogRecGetBlockTag(), and XLogRecGetData.
Referenced by gist_redo().
◆ gistRedoPageDelete()
Definition at line 342 of file gistxlog.c.
343{
348
350 {
352
354
357 }
358
360 {
362
364
367 }
368
373}
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
static void GistPageSetDeleted(Page page, FullTransactionId deletexid)
FullTransactionId deleteXid
OffsetNumber downlinkOffset
References BLK_NEEDS_REDO, BufferGetPage(), BufferIsValid(), gistxlogPageDelete::deleteXid, gistxlogPageDelete::downlinkOffset, XLogReaderState::EndRecPtr, GistPageSetDeleted(), MarkBufferDirty(), PageIndexTupleDelete(), PageSetLSN(), UnlockReleaseBuffer(), XLogReadBufferForRedo(), and XLogRecGetData.
Referenced by gist_redo().
◆ gistRedoPageReuse()
◆ gistRedoPageSplitRecord()
Definition at line 247 of file gistxlog.c.
248{
254 int i;
255 bool isrootsplit = false;
256
257
258
259
260
261
262
263
264
265
266 for (i = 0; i < xldata->npage; i++)
267 {
268 int flags;
270 Size datalen;
271 int num;
274
277 {
279 isrootsplit = true;
280 }
281
285
287
288
291 else
292 flags = 0;
294
295
297
299 {
303 }
304 else
305 {
306 if (i < xldata->npage - 1)
307 {
309
312 }
313 else
316 if (i < xldata->npage - 1 && !isrootsplit &&
319 else
321 }
322
325
326 if (i == 0)
327 firstbuffer = buffer;
328 else
330 }
331
332
335
336
338}
#define InvalidBlockNumber
#define GistPageGetOpaque(page)
void gistfillbuffer(Page page, IndexTuple *itup, int len, OffsetNumber off)
void GISTInitBuffer(Buffer b, uint32 f)
static IndexTuple * decodePageSplitRecord(char *begin, int len, int *n)
static void gistRedoClearFollowRight(XLogReaderState *record, uint8 block_id)
#define FirstOffsetNumber
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
#define XLogRecHasBlockRef(decoder, block_id)
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
References Assert(), BufferGetPage(), data, decodePageSplitRecord(), XLogReaderState::EndRecPtr, F_LEAF, FirstOffsetNumber, GIST_ROOT_BLKNO, GistClearFollowRight, gistfillbuffer(), GISTInitBuffer(), GistMarkFollowRight, GistPageGetOpaque, GistPageSetNSN, gistRedoClearFollowRight(), i, InvalidBlockNumber, InvalidBuffer, MarkBufferDirty(), gistxlogPageSplit::markfollowright, gistxlogPageSplit::npage, gistxlogPageSplit::origleaf, gistxlogPageSplit::orignsn, gistxlogPageSplit::origrlink, PageSetLSN(), UnlockReleaseBuffer(), XLogInitBufferForRedo(), XLogRecGetBlockData(), XLogRecGetBlockTag(), XLogRecGetData, and XLogRecHasBlockRef.
Referenced by gist_redo().
◆ gistRedoPageUpdateRecord()
Definition at line 70 of file gistxlog.c.
71{
76
78 {
79 char *begin;
83
85
87
89 {
90
91
92
93
96 Size itupsize;
97
102 elog(ERROR, "failed to add item to GiST index page, size %d bytes",
103 (int) itupsize);
104 data += itupsize;
105
107
108 ninserted++;
109 }
111 {
112
114
116
120 }
121
122
123 if (data - begin < datalen)
124 {
127
128 while (data - begin < datalen)
129 {
133
135
136 l = PageAddItem(page, (Item) itup, sz, off, false, false);
138 elog(ERROR, "failed to add item to GiST index page, size %d bytes",
139 (int) sz);
140 off++;
141 ninserted++;
142 }
143 }
144
145
147
150 }
151
152
153
154
155
156
157
158
161
164}
bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize)
static bool PageIsEmpty(const PageData *page)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define PG_USED_FOR_ASSERTS_ONLY
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
References Assert(), BLK_NEEDS_REDO, BufferGetPage(), BufferIsValid(), data, elog, XLogReaderState::EndRecPtr, ERROR, FirstOffsetNumber, GistMarkTuplesDeleted, GistPageIsLeaf, gistRedoClearFollowRight(), IndexTupleSize(), InvalidOffsetNumber, MarkBufferDirty(), gistxlogPageUpdate::ntodelete, gistxlogPageUpdate::ntoinsert, OffsetNumberNext, PageAddItem, PageGetMaxOffsetNumber(), PageIndexMultiDelete(), PageIndexTupleOverwrite(), PageIsEmpty(), PageSetLSN(), PG_USED_FOR_ASSERTS_ONLY, UnlockReleaseBuffer(), XLogReadBufferForRedo(), XLogRecGetBlockData(), XLogRecGetData, and XLogRecHasBlockRef.
Referenced by gist_redo().
◆ gistXLogAssignLSN()
◆ gistXLogDelete()
Definition at line 670 of file gistxlog.c.
672{
675
679
682
683
684
685
686
687
689
691
693
694 return recptr;
695}
#define SizeOfGistxlogDelete
#define RelationIsAccessibleInLogicalDecoding(relation)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
References gistxlogDelete::isCatalogRel, gistxlogDelete::ntodelete, REGBUF_STANDARD, RelationIsAccessibleInLogicalDecoding, SizeOfGistxlogDelete, gistxlogDelete::snapshotConflictHorizon, XLOG_GIST_DELETE, XLogBeginInsert(), XLogInsert(), XLogRegisterBuffer(), and XLogRegisterData().
Referenced by gistprunepage().
◆ gistXLogPageDelete()
◆ gistXLogPageReuse()
Definition at line 594 of file gistxlog.c.
596{
598
599
600
601
602
603
604
605
608 xlrec_reuse.block = blkno;
610
613
615}
#define SizeOfGistxlogPageReuse
RelFileLocator rd_locator
References gistxlogPageReuse::block, gistxlogPageReuse::isCatalogRel, gistxlogPageReuse::locator, RelationData::rd_locator, RelationIsAccessibleInLogicalDecoding, SizeOfGistxlogPageReuse, gistxlogPageReuse::snapshotConflictHorizon, XLOG_GIST_PAGE_REUSE, XLogBeginInsert(), XLogInsert(), and XLogRegisterData().
Referenced by gistNewBuffer().
◆ gistXLogSplit()
Definition at line 495 of file gistxlog.c.
499{
502 int npage = 0;
504 int i;
505
506 for (ptr = dist; ptr; ptr = ptr->next)
507 npage++;
508
511 xlrec.origleaf = page_is_leaf;
514
516
517
518
519
520
523
524
525
526
527
528
529
530
532
533 i = 1;
534 for (ptr = dist; ptr; ptr = ptr->next)
535 {
539 i++;
540 }
541
543
544 return recptr;
545}
struct SplitPageLayout * next
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
References SplitPageLayout::block, SplitPageLayout::buffer, BufferIsValid(), i, SplitPageLayout::lenlist, SplitPageLayout::list, gistxlogPageSplit::markfollowright, SplitPageLayout::next, gistxlogPageSplit::npage, gistxlogPage::num, gistxlogPageSplit::origleaf, gistxlogPageSplit::orignsn, gistxlogPageSplit::origrlink, REGBUF_STANDARD, REGBUF_WILL_INIT, XLOG_GIST_PAGE_SPLIT, XLogBeginInsert(), XLogInsert(), XLogRegisterBufData(), XLogRegisterBuffer(), and XLogRegisterData().
Referenced by gistplacetopage().
◆ gistXLogUpdate()
Definition at line 629 of file gistxlog.c.
633{
635 int i;
637
640
643
646
647
648 for (i = 0; i < ituplen; i++)
650
651
652
653
654
657
659
660 return recptr;
661}
References BufferIsValid(), i, IndexTupleSize(), gistxlogPageUpdate::ntodelete, gistxlogPageUpdate::ntoinsert, REGBUF_STANDARD, XLOG_GIST_PAGE_UPDATE, XLogBeginInsert(), XLogInsert(), XLogRegisterBufData(), XLogRegisterBuffer(), and XLogRegisterData().
Referenced by gistplacetopage(), and gistvacuumpage().