PostgreSQL Source Code: src/backend/access/gist/gistxlog.c File Reference (original) (raw)

Go to the source code of this file.

Functions
static void gistRedoClearFollowRight (XLogReaderState *record, uint8 block_id)
static void gistRedoPageUpdateRecord (XLogReaderState *record)
static void gistRedoDeleteRecord (XLogReaderState *record)
static IndexTuple * decodePageSplitRecord (char *begin, int len, int *n)
static void gistRedoPageSplitRecord (XLogReaderState *record)
static void gistRedoPageDelete (XLogReaderState *record)
static void gistRedoPageReuse (XLogReaderState *record)
void gist_redo (XLogReaderState *record)
void gist_xlog_startup (void)
void gist_xlog_cleanup (void)
void gist_mask (char *pagedata, BlockNumber blkno)
XLogRecPtr gistXLogSplit (bool page_is_leaf, SplitPageLayout *dist, BlockNumber origrlink, GistNSN orignsn, Buffer leftchildbuf, bool markfollowright)
XLogRecPtr gistXLogPageDelete (Buffer buffer, FullTransactionId xid, Buffer parentBuffer, OffsetNumber downlinkOffset)
XLogRecPtr gistXLogAssignLSN (void)
void gistXLogPageReuse (Relation rel, Relation heaprel, BlockNumber blkno, FullTransactionId deleteXid)
XLogRecPtr gistXLogUpdate (Buffer buffer, OffsetNumber *todelete, int ntodelete, IndexTuple *itup, int ituplen, Buffer leftchildbuf)
XLogRecPtr gistXLogDelete (Buffer buffer, OffsetNumber *todelete, int ntodelete, TransactionId snapshotConflictHorizon, Relation heaprel)

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

235 for (i = 0; i < *n; i++)

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().

opCtx