HashMetaPage cachedmetap;
HashBulkDeleteStreamPrivate stream_private;
ReadStream *stream = NULL;
+ XLogRecPtr recptr;
tuples_removed = 0;
num_index_tuples = 0;
if (RelationNeedsWAL(rel))
{
xl_hash_update_meta_page xlrec;
- XLogRecPtr recptr;
xlrec.ntuples = metap->hashm_ntuples;
XLogRegisterBuffer(0, metabuf, REGBUF_STANDARD);
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_UPDATE_META_PAGE);
- PageSetLSN(BufferGetPage(metabuf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(metabuf), recptr);
END_CRIT_SECTION();
Buffer buf;
Bucket new_bucket PG_USED_FOR_ASSERTS_ONLY = InvalidBucket;
bool bucket_dirty = false;
+ XLogRecPtr recptr;
blkno = bucket_blkno;
buf = bucket_buf;
if (RelationNeedsWAL(rel))
{
xl_hash_delete xlrec;
- XLogRecPtr recptr;
xlrec.clear_dead_marking = clear_dead_marking;
xlrec.is_primary_bucket_page = (buf == bucket_buf);
ndeletable * sizeof(OffsetNumber));
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_DELETE);
- PageSetLSN(BufferGetPage(buf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(buf), recptr);
END_CRIT_SECTION();
}
/* XLOG stuff */
if (RelationNeedsWAL(rel))
{
- XLogRecPtr recptr;
-
XLogBeginInsert();
XLogRegisterBuffer(0, bucket_buf, REGBUF_STANDARD);
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_SPLIT_CLEANUP);
- PageSetLSN(page, recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(page, recptr);
END_CRIT_SECTION();
}
uint32 hashkey;
Bucket bucket;
OffsetNumber itup_off;
+ XLogRecPtr recptr;
/*
* Get the hash key for the item (it's stored in the index tuple itself).
if (RelationNeedsWAL(rel))
{
xl_hash_insert xlrec;
- XLogRecPtr recptr;
xlrec.offnum = itup_off;
XLogRegisterBufData(0, itup, IndexTupleSize(itup));
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_INSERT);
-
- PageSetLSN(BufferGetPage(buf), recptr);
- PageSetLSN(BufferGetPage(metabuf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(buf), recptr);
+ PageSetLSN(BufferGetPage(metabuf), recptr);
END_CRIT_SECTION();
Page page = BufferGetPage(buf);
HashPageOpaque pageopaque;
HashMetaPage metap;
+ XLogRecPtr recptr;
/* Scan each tuple in page to see if it is marked as LP_DEAD */
maxoff = PageGetMaxOffsetNumber(page);
if (RelationNeedsWAL(rel))
{
xl_hash_vacuum_one_page xlrec;
- XLogRecPtr recptr;
xlrec.isCatalogRel = RelationIsAccessibleInLogicalDecoding(hrel);
xlrec.snapshotConflictHorizon = snapshotConflictHorizon;
XLogRegisterBuffer(1, metabuf, REGBUF_STANDARD);
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_VACUUM_ONE_PAGE);
-
- PageSetLSN(BufferGetPage(buf), recptr);
- PageSetLSN(BufferGetPage(metabuf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(buf), recptr);
+ PageSetLSN(BufferGetPage(metabuf), recptr);
END_CRIT_SECTION();
uint32 i,
j;
bool page_found = false;
+ XLogRecPtr recptr;
/*
* Write-lock the tail page. Here, we need to maintain locking order such
/* XLOG stuff */
if (RelationNeedsWAL(rel))
{
- XLogRecPtr recptr;
xl_hash_add_ovfl_page xlrec;
xlrec.bmpage_found = page_found;
XLogRegisterBufData(4, &metap->hashm_firstfree, sizeof(uint32));
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_ADD_OVFL_PAGE);
+ }
+ else
+ recptr = XLogGetFakeLSN(rel);
- PageSetLSN(BufferGetPage(ovflbuf), recptr);
- PageSetLSN(BufferGetPage(buf), recptr);
+ PageSetLSN(BufferGetPage(ovflbuf), recptr);
+ PageSetLSN(BufferGetPage(buf), recptr);
- if (BufferIsValid(mapbuf))
- PageSetLSN(BufferGetPage(mapbuf), recptr);
+ if (BufferIsValid(mapbuf))
+ PageSetLSN(BufferGetPage(mapbuf), recptr);
- if (BufferIsValid(newmapbuf))
- PageSetLSN(BufferGetPage(newmapbuf), recptr);
+ if (BufferIsValid(newmapbuf))
+ PageSetLSN(BufferGetPage(newmapbuf), recptr);
- PageSetLSN(BufferGetPage(metabuf), recptr);
- }
+ PageSetLSN(BufferGetPage(metabuf), recptr);
END_CRIT_SECTION();
Bucket bucket PG_USED_FOR_ASSERTS_ONLY;
Buffer prevbuf = InvalidBuffer;
Buffer nextbuf = InvalidBuffer;
- bool update_metap = false;
+ bool update_metap = false,
+ mod_wbuf,
+ is_prim_bucket_same_wrt,
+ is_prev_bucket_same_wrt;
+ XLogRecPtr recptr;
/* Get information from the doomed page */
_hash_checkpage(rel, ovflbuf, LH_OVERFLOW_PAGE);
MarkBufferDirty(metabuf);
}
+ /* Determine which pages are modified */
+ is_prim_bucket_same_wrt = (wbuf == bucketbuf);
+ is_prev_bucket_same_wrt = (wbuf == prevbuf);
+ mod_wbuf = (nitups > 0 || is_prev_bucket_same_wrt);
+
/* XLOG stuff */
if (RelationNeedsWAL(rel))
{
xl_hash_squeeze_page xlrec;
- XLogRecPtr recptr;
- int i;
- bool mod_wbuf = false;
xlrec.prevblkno = prevblkno;
xlrec.nextblkno = nextblkno;
xlrec.ntups = nitups;
- xlrec.is_prim_bucket_same_wrt = (wbuf == bucketbuf);
- xlrec.is_prev_bucket_same_wrt = (wbuf == prevbuf);
+ xlrec.is_prim_bucket_same_wrt = is_prim_bucket_same_wrt;
+ xlrec.is_prev_bucket_same_wrt = is_prev_bucket_same_wrt;
XLogBeginInsert();
XLogRegisterData(&xlrec, SizeOfHashSqueezePage);
* bucket buffer was not changed, but still needs to be registered to
* ensure that we can acquire a cleanup lock on it during replay.
*/
- if (!xlrec.is_prim_bucket_same_wrt)
+ if (!is_prim_bucket_same_wrt)
{
uint8 flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE;
XLogRegisterBuffer(0, bucketbuf, flags);
}
- if (xlrec.ntups > 0)
+ if (nitups > 0)
{
XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD);
-
- /* Remember that wbuf is modified. */
- mod_wbuf = true;
-
XLogRegisterBufData(1, itup_offsets,
nitups * sizeof(OffsetNumber));
- for (i = 0; i < nitups; i++)
+ for (int i = 0; i < nitups; i++)
XLogRegisterBufData(1, itups[i], tups_size[i]);
}
- else if (xlrec.is_prim_bucket_same_wrt || xlrec.is_prev_bucket_same_wrt)
+ else if (is_prim_bucket_same_wrt || is_prev_bucket_same_wrt)
{
uint8 wbuf_flags;
* if it is the same as primary bucket buffer or update the
* nextblkno if it is same as the previous bucket buffer.
*/
- Assert(xlrec.ntups == 0);
+ Assert(nitups == 0);
wbuf_flags = REGBUF_STANDARD;
- if (!xlrec.is_prev_bucket_same_wrt)
- {
+ if (!is_prev_bucket_same_wrt)
wbuf_flags |= REGBUF_NO_CHANGE;
- }
else
- {
- /* Remember that wbuf is modified. */
- mod_wbuf = true;
- }
+ Assert(mod_wbuf);
XLogRegisterBuffer(1, wbuf, wbuf_flags);
}
* prevpage. During replay, we can directly update the nextblock in
* writepage.
*/
- if (BufferIsValid(prevbuf) && !xlrec.is_prev_bucket_same_wrt)
+ if (BufferIsValid(prevbuf) && !is_prev_bucket_same_wrt)
XLogRegisterBuffer(3, prevbuf, REGBUF_STANDARD);
if (BufferIsValid(nextbuf))
}
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_SQUEEZE_PAGE);
+ }
+ else /* !RelationNeedsWAL(rel) */
+ recptr = XLogGetFakeLSN(rel);
- /* Set LSN iff wbuf is modified. */
- if (mod_wbuf)
- PageSetLSN(BufferGetPage(wbuf), recptr);
+ /* Set LSN iff wbuf is modified. */
+ if (mod_wbuf)
+ PageSetLSN(BufferGetPage(wbuf), recptr);
- PageSetLSN(BufferGetPage(ovflbuf), recptr);
+ PageSetLSN(BufferGetPage(ovflbuf), recptr);
- if (BufferIsValid(prevbuf) && !xlrec.is_prev_bucket_same_wrt)
- PageSetLSN(BufferGetPage(prevbuf), recptr);
- if (BufferIsValid(nextbuf))
- PageSetLSN(BufferGetPage(nextbuf), recptr);
+ if (BufferIsValid(prevbuf) && !is_prev_bucket_same_wrt)
+ PageSetLSN(BufferGetPage(prevbuf), recptr);
+ if (BufferIsValid(nextbuf))
+ PageSetLSN(BufferGetPage(nextbuf), recptr);
- PageSetLSN(BufferGetPage(mapbuf), recptr);
+ PageSetLSN(BufferGetPage(mapbuf), recptr);
- if (update_metap)
- PageSetLSN(BufferGetPage(metabuf), recptr);
- }
+ if (update_metap)
+ PageSetLSN(BufferGetPage(metabuf), recptr);
END_CRIT_SECTION();
if (nitups > 0)
{
+ XLogRecPtr recptr;
+
Assert(nitups == ndeletable);
/*
/* XLOG stuff */
if (RelationNeedsWAL(rel))
{
- XLogRecPtr recptr;
xl_hash_move_page_contents xlrec;
xlrec.ntups = nitups;
ndeletable * sizeof(OffsetNumber));
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_MOVE_PAGE_CONTENTS);
-
- PageSetLSN(BufferGetPage(wbuf), recptr);
- PageSetLSN(BufferGetPage(rbuf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(wbuf), recptr);
+ PageSetLSN(BufferGetPage(rbuf), recptr);
END_CRIT_SECTION();
uint32 lowmask;
bool metap_update_masks = false;
bool metap_update_splitpoint = false;
+ XLogRecPtr recptr;
restart_expand:
if (RelationNeedsWAL(rel))
{
xl_hash_split_allocate_page xlrec;
- XLogRecPtr recptr;
xlrec.new_bucket = maxbucket;
xlrec.old_bucket_flag = oopaque->hasho_flag;
XLogRegisterData(&xlrec, SizeOfHashSplitAllocPage);
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_SPLIT_ALLOCATE_PAGE);
-
- PageSetLSN(BufferGetPage(buf_oblkno), recptr);
- PageSetLSN(BufferGetPage(buf_nblkno), recptr);
- PageSetLSN(BufferGetPage(metabuf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(buf_oblkno), recptr);
+ PageSetLSN(BufferGetPage(buf_nblkno), recptr);
+ PageSetLSN(BufferGetPage(metabuf), recptr);
END_CRIT_SECTION();
Size all_tups_size = 0;
int i;
uint16 nitups = 0;
+ XLogRecPtr recptr;
bucket_obuf = obuf;
opage = BufferGetPage(obuf);
if (RelationNeedsWAL(rel))
{
- XLogRecPtr recptr;
xl_hash_split_complete xlrec;
xlrec.old_bucket_flag = oopaque->hasho_flag;
XLogRegisterBuffer(1, bucket_nbuf, REGBUF_STANDARD);
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_SPLIT_COMPLETE);
-
- PageSetLSN(BufferGetPage(bucket_obuf), recptr);
- PageSetLSN(BufferGetPage(bucket_nbuf), recptr);
}
+ else
+ recptr = XLogGetFakeLSN(rel);
+
+ PageSetLSN(BufferGetPage(bucket_obuf), recptr);
+ PageSetLSN(BufferGetPage(bucket_nbuf), recptr);
END_CRIT_SECTION();