Skip to content

Commit 7552453

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 9b0f19d commit 7552453

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
@@ -4475,7 +4475,7 @@ XLOGShmemInit(void)
44754475

44764476

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

44804480
{
44814481
static HASHCTL info;
@@ -6156,9 +6156,9 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
61566156
* SetLastWrittenLsn with dummy rnode is used by createdb and dbase_redo functions.
61576157
*/
61586158
void
6159-
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber from, BlockNumber till)
6159+
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks)
61606160
{
6161-
if (lsn == InvalidXLogRecPtr)
6161+
if (lsn == InvalidXLogRecPtr || n_blocks == 0)
61626162
return;
61636163

61646164
LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE);
@@ -6173,12 +6173,15 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
61736173
BufferTag key;
61746174
bool found;
61756175
BlockNumber bucket;
6176+
BlockNumber start_bucket; /* inclusive */
6177+
BlockNumber end_bucket; /* exclusive */
6178+
6179+
start_bucket = from / LAST_WRITTEN_LSN_CACHE_BUCKET;
6180+
end_bucket = (from + n_blocks + LAST_WRITTEN_LSN_CACHE_BUCKET - 1) / LAST_WRITTEN_LSN_CACHE_BUCKET;
61766181

61776182
key.rnode = rnode;
61786183
key.forkNum = forknum;
6179-
for (bucket = from / LAST_WRITTEN_LSN_CACHE_BUCKET;
6180-
bucket <= till / LAST_WRITTEN_LSN_CACHE_BUCKET;
6181-
bucket++)
6184+
for (bucket = start_bucket; bucket < end_bucket; bucket++)
61826185
{
61836186
key.blockNum = bucket;
61846187
entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found);
@@ -6216,7 +6219,7 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
62166219
void
62176220
SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
62186221
{
6219-
SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, blkno);
6222+
SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, 1);
62206223
}
62216224

62226225
/*

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)