Skip to content

Commit 8633d7a

Browse files
knizhniktristan957
authored andcommitted
Fix shared memory initialization for last written LSN cache (#226)
* Fix shared memory initialization for last written LSN cache Replace (from,till) with (from,n_blocks) for SetLastWrittenLSNForBlockRange function * Fast exit from SetLastWrittenLSNForBlockRange for n_blocks == 0
1 parent 2ad7b4f commit 8633d7a

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

src/backend/access/transam/xlog.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4477,7 +4477,7 @@ XLOGShmemInit(void)
44774477

44784478

44794479
XLogCtl = (XLogCtlData *)
4480-
ShmemInitStruct("XLOG Ctl", XLOGShmemSize(), &foundXLog);
4480+
ShmemInitStruct("XLOG Ctl", XLOGCtlShmemSize(), &foundXLog);
44814481

44824482
{
44834483
static HASHCTL info;
@@ -6158,9 +6158,9 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
61586158
* SetLastWrittenLsn with dummy rnode is used by createdb and dbase_redo functions.
61596159
*/
61606160
void
6161-
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber from, BlockNumber till)
6161+
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks)
61626162
{
6163-
if (lsn == InvalidXLogRecPtr)
6163+
if (lsn == InvalidXLogRecPtr || n_blocks == 0)
61646164
return;
61656165

61666166
LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE);
@@ -6175,12 +6175,15 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
61756175
BufferTag key;
61766176
bool found;
61776177
BlockNumber bucket;
6178+
BlockNumber start_bucket; /* inclusive */
6179+
BlockNumber end_bucket; /* exclusive */
6180+
6181+
start_bucket = from / LAST_WRITTEN_LSN_CACHE_BUCKET;
6182+
end_bucket = (from + n_blocks + LAST_WRITTEN_LSN_CACHE_BUCKET - 1) / LAST_WRITTEN_LSN_CACHE_BUCKET;
61786183

61796184
key.rnode = rnode;
61806185
key.forkNum = forknum;
6181-
for (bucket = from / LAST_WRITTEN_LSN_CACHE_BUCKET;
6182-
bucket <= till / LAST_WRITTEN_LSN_CACHE_BUCKET;
6183-
bucket++)
6186+
for (bucket = start_bucket; bucket < end_bucket; bucket++)
61846187
{
61856188
key.blockNum = bucket;
61866189
entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found);
@@ -6218,7 +6221,7 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
62186221
void
62196222
SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
62206223
{
6221-
SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, blkno);
6224+
SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, 1);
62226225
}
62236226

62246227
/*

src/include/access/xlog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ extern XLogRecPtr GetLastImportantRecPtr(void);
259259
/* neon specifics */
260260

261261
extern void SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
262-
extern void SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber till);
262+
extern void SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
263263
extern void SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
264264
extern void SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum);
265265
extern XLogRecPtr GetLastWrittenLSN(RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);

0 commit comments

Comments
 (0)