PostgreSQL Source Code: src/backend/access/gin/ginxlog.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

15

21

23

24static void

26{

30

32 {

35

38 }

41}

42

43static void

45{

48 char *ptr;

51

54

56

58

59

61

63

65

68}

69

70static void

72{

77

79 {

80

85 }

86

87 if (data->isDelete)

88 {

92 }

93

94 itup = &data->tuple;

95

97 {

101

102 BufferGetTag(buffer, &locator, &forknum, &blknum);

103 elog(ERROR, "failed to add item to index page in %u/%u/%u",

105 }

106}

107

108

109

110

111

112

113

114

115

116static void

118{

119 int actionno;

120 int segno;

123 char *walbuf;

124 int totalsize;

128

129

130

131

133 {

136 int npacked;

137

138

139

140

141

142

143

144 if (nuncompressed > 0)

145 {

147

149 BLCKSZ, &npacked);

151

152 Assert(npacked == nuncompressed);

153

155 }

156 else

157 {

158 totalsize = 0;

159 }

160

164 }

165

167 writePtr = (Pointer) oldseg;

169 segno = 0;

170

172 for (actionno = 0; actionno < data->nactions; actionno++)

173 {

174 uint8 a_segno = *((uint8 *) (walbuf++));

175 uint8 a_action = *((uint8 *) (walbuf++));

177 int newsegsize = 0;

181 int nolditems;

183 int nnewitems;

184 int segsize;

185

186

189 {

193 }

194

196 {

198 walbuf += sizeof(uint16);

201 }

202

203

204 Assert(segno <= a_segno);

205 while (segno < a_segno)

206 {

207

208

209

210

212 if (tailCopy)

213 {

215 memcpy(writePtr, (Pointer) oldseg, segsize);

216 }

217 writePtr += segsize;

219 segno++;

220 }

221

222

223

224

225

226

228 {

229 int npacked;

230

232

234 olditems, nolditems,

235 &nnewitems);

237

239 BLCKSZ, &npacked);

240 Assert(npacked == nnewitems);

241

244 }

245

246 segptr = (Pointer) oldseg;

247 if (segptr != segmentend)

249 else

250 {

251

252

253

254

256 segsize = 0;

257 }

258

259

260

261

262

263 if (!tailCopy && segptr != segmentend)

264 {

265 int tailSize = segmentend - segptr;

266

268 memcpy(tailCopy, segptr, tailSize);

269 segptr = tailCopy;

271 segmentend = segptr + tailSize;

272 }

273

274 switch (a_action)

275 {

277 segptr += segsize;

278 segno++;

279 break;

280

282

284 memcpy(writePtr, newseg, newsegsize);

285 writePtr += newsegsize;

286 break;

287

289

291 memcpy(writePtr, newseg, newsegsize);

292 writePtr += newsegsize;

293 segptr += segsize;

294 segno++;

295 break;

296

297 default:

298 elog(ERROR, "unexpected GIN leaf action: %u", a_action);

299 }

301 }

302

303

304 segptr = (Pointer) oldseg;

305 if (segptr != segmentend && tailCopy)

306 {

307 int restSize = segmentend - segptr;

308

310 memcpy(writePtr, segptr, restSize);

311 writePtr += restSize;

312 }

313

316}

317

318static void

320{

322

323 if (isLeaf)

324 {

326

328

330 }

331 else

332 {

335

337

338

341

343 }

344}

345

346static void

348{

352#ifdef NOT_USED

354#endif

357

358

359

360

361

362 if (!isLeaf)

363 {

365

366#ifdef NOT_USED

368#endif

372

374 }

375

377 {

381

382

384 {

387 }

388 else

389 {

392 }

393

396 }

399}

400

401static void

403{

406 rbuffer,

407 rootbuf;

410

411

412

413

414

415 if (!isLeaf)

417

419 elog(ERROR, "GIN split record did not contain a full-page image of left page");

420

422 elog(ERROR, "GIN split record did not contain a full-page image of right page");

423

424 if (isRoot)

425 {

427 elog(ERROR, "GIN split record did not contain a full-page image of root page");

429 }

430

433}

434

435

436

437

438

439static void

441{

443

445 {

446 elog(ERROR, "replay of gin entry tree page vacuum did not restore the page");

447 }

449}

450

451static void

453{

456

458 {

462

464

467

471 }

474}

475

476static void

478{

485

486

487

488

489

491 {

497 }

498

500 {

507 }

508

510 {

517 }

518

525}

526

527static void

529{

533 Page metapage;

535

536

537

538

539

540

544

549

550 if (data->ntuples > 0)

551 {

552

553

554

556 {

559 int i;

560 Size tupsize;

561 char *payload;

563 Size totaltupsize;

564

567

570 else

572

573 for (i = 0; i < data->ntuples; i++)

574 {

576

579 elog(ERROR, "failed to add item to index page");

580

581 tuples = (IndexTuple) (((char *) tuples) + tupsize);

582

583 off++;

584 }

585 Assert(payload + totaltupsize == (char *) tuples);

586

587

588

589

591

594 }

597 }

599 {

600

601

602

604 {

606

608

611 }

614 }

615

617}

618

619static void

621{

628 int i,

629 tupsize;

630 char *payload;

632 Size totaltupsize;

633

634

637

641 {

642

645 }

646 else

647 {

649 }

650

652

654 for (i = 0; i < data->ntuples; i++)

655 {

657

658 l = PageAddItem(page, (Item) tuples, tupsize, off, false, false);

659

661 elog(ERROR, "failed to add item to index page");

662

663 tuples = (IndexTuple) (((char *) tuples) + tupsize);

664 off++;

665 }

666 Assert((char *) tuples == payload + totaltupsize);

667

670

672}

673

674static void

676{

680 Page metapage;

681 int i;

682

686

688

692

693

694

695

696

697

698

699

700

701

702

703

704

705

706

707

708 for (i = 0; i < data->ndeleted; i++)

709 {

712

716

719

721 }

723}

724

725void

727{

730

731

732

733

734

735

736

738 switch (info)

739 {

742 break;

745 break;

748 break;

751 break;

754 break;

757 break;

760 break;

763 break;

766 break;

767 default:

768 elog(PANIC, "gin_redo: unknown op code %u", info);

769 }

772}

773

774void

776{

778 "GIN recovery temporary context",

780}

781

782void

784{

787}

788

789

790

791

792void

794{

798

801

803

804

805

806

807

808

813}

struct BlockIdData BlockIdData

#define InvalidBlockNumber

static BlockNumber BlockIdGetBlockNumber(const BlockIdData *blockId)

void mask_page_content(Page page)

void mask_page_lsn_and_checksum(Page page)

void mask_unused_space(Page page)

void mask_page_hint_bits(Page page)

BlockNumber BufferGetBlockNumber(Buffer buffer)

void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)

void UnlockReleaseBuffer(Buffer buffer)

void MarkBufferDirty(Buffer buffer)

static Page BufferGetPage(Buffer buffer)

static bool BufferIsValid(Buffer bufnum)

void PageIndexTupleDelete(Page page, OffsetNumber offnum)

static bool PageIsEmpty(const PageData *page)

PageHeaderData * PageHeader

#define PageGetSpecialPointer(page)

static Item PageGetItem(const PageData *page, const ItemIdData *itemId)

#define SizeOfPageHeaderData

static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)

static void PageSetLSN(Page page, XLogRecPtr lsn)

#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)

static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)

#define GIN_METAPAGE_BLKNO

#define GinPageGetOpaque(page)

#define SizeOfGinPostingList(plist)

#define GinPageSetDeleteXid(page, xid)

#define GinDataLeafPageGetPostingListSize(page)

#define GinSetDownlink(itup, blkno)

#define GinDataPageSetDataSize(page, size)

#define GinPageSetCompressed(page)

#define GinNextPostingListSegment(cur)

#define GinPageIsData(page)

#define GinPageGetMeta(p)

#define GinDataPageGetPostingItem(page, i)

#define GinDataPageGetData(page)

#define PostingItemSetBlockNumber(pointer, blockNumber)

#define GinPageIsCompressed(page)

#define GinPageSetDeleted(page)

#define GinPageIsLeaf(page)

#define GinPageSetFullRow(page)

#define GinDataLeafPageGetPostingList(page)

void GinPageDeletePostingItem(Page page, OffsetNumber offset)

void GinDataPageAddPostingItem(Page page, PostingItem *data, OffsetNumber offset)

ItemPointer ginPostingListDecode(GinPostingList *plist, int *ndecoded_out)

GinPostingList * ginCompressPostingList(const ItemPointer ipd, int nipd, int maxsize, int *nwritten)

ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb, int *nmerged)

void GinInitBuffer(Buffer b, uint32 f)

void GinInitMetabuffer(Buffer b)

static void ginRedoInsertEntry(Buffer buffer, bool isLeaf, BlockNumber rightblkno, void *rdata)

static void ginRedoInsert(XLogReaderState *record)

static void ginRedoSplit(XLogReaderState *record)

void gin_redo(XLogReaderState *record)

void gin_mask(char *pagedata, BlockNumber blkno)

static void ginRedoClearIncompleteSplit(XLogReaderState *record, uint8 block_id)

void gin_xlog_startup(void)

static void ginRedoDeletePage(XLogReaderState *record)

static void ginRedoVacuumDataLeafPage(XLogReaderState *record)

static void ginRedoDeleteListPages(XLogReaderState *record)

static void ginRedoUpdateMetapage(XLogReaderState *record)

static void ginRedoInsertData(Buffer buffer, bool isLeaf, BlockNumber rightblkno, void *rdata)

void gin_xlog_cleanup(void)

static void ginRedoInsertListPage(XLogReaderState *record)

static MemoryContext opCtx

static void ginRedoCreatePTree(XLogReaderState *record)

static void ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)

static void ginRedoVacuumPage(XLogReaderState *record)

#define GIN_INSERT_ISDATA

#define GIN_INSERT_ISLEAF

#define XLOG_GIN_UPDATE_META_PAGE

#define GIN_SEGMENT_ADDITEMS

#define GIN_SEGMENT_DELETE

#define XLOG_GIN_CREATE_PTREE

#define XLOG_GIN_VACUUM_PAGE

#define XLOG_GIN_DELETE_PAGE

#define XLOG_GIN_INSERT_LISTPAGE

#define XLOG_GIN_VACUUM_DATA_LEAF_PAGE

struct ginxlogCreatePostingTree ginxlogCreatePostingTree

#define GIN_SEGMENT_INSERT

#define XLOG_GIN_DELETE_LISTPAGE

#define GIN_SEGMENT_REPLACE

Assert(PointerIsAligned(start, uint64))

ItemPointerData * ItemPointer

struct ItemPointerData ItemPointerData

IndexTupleData * IndexTuple

static Size IndexTupleSize(const IndexTupleData *itup)

void MemoryContextReset(MemoryContext context)

MemoryContext CurrentMemoryContext

void MemoryContextDelete(MemoryContext context)

#define AllocSetContextCreate

#define ALLOCSET_DEFAULT_SIZES

#define InvalidOffsetNumber

#define OffsetNumberNext(offsetNumber)

#define FirstOffsetNumber

static MemoryContext MemoryContextSwitchTo(MemoryContext context)

ginxlogRecompressDataLeaf data

char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)

#define XLogRecGetInfo(decoder)

#define XLogRecGetData(decoder)

XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)

Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)