From 80f0c9bc8e5de472cc1f73a02f7c3e88fd8ed5ce Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Thu, 27 Feb 2025 17:12:46 -0500 Subject: [PATCH 01/41] added first draft code for moving lwlsn cache to neon ext --- pgxn/neon/neon_lwlc.c | 474 ++++++++++++++++++++++++++++++++++++++++++ pgxn/neon/neon_lwlc.h | 14 ++ vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- 5 files changed, 491 insertions(+), 3 deletions(-) create mode 100644 pgxn/neon/neon_lwlc.c create mode 100644 pgxn/neon/neon_lwlc.h diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c new file mode 100644 index 000000000000..f394df9fbebf --- /dev/null +++ b/pgxn/neon/neon_lwlc.c @@ -0,0 +1,474 @@ +#include "neon_lwlc.h" +#include "postgres.h" +#include "access/xlog.h" +#include "storage/shmem.h" +#include "storage/buf_internals.h" + + +#define INSTALL_HOOK(name, function) \ +do { \ + prev_##name = (name); \ + name = &(function); \ +} while (false) + +#define FORWARD_HOOK_CALL(name, ...) \ +do { \ + if (prev_##name) \ + prev_##name(__VA_ARGS__); \ +} while (false) + + +typedef struct LastWrittenLsnCacheEntry +{ + BufferTag key; + XLogRecPtr lsn; + /* double linked list for LRU replacement algorithm */ + dlist_node lru_node; +} LastWrittenLsnCacheEntry; + +LwLSN +/* + * Maximal last written LSN for pages not present in lastWrittenLsnCache + */ +XLogRecPtr maxLastWrittenLsn; + +/* + * Double linked list to implement LRU replacement policy for last written LSN cache. + * Access to this list as well as to last written LSN cache is protected by 'LastWrittenLsnLock'. + */ +dlist_head lastWrittenLsnLRU; + +/* + * Cache of last written LSN for each relation page. + * Also to provide request LSN for smgrnblocks, smgrexists there is pseudokey=InvalidBlockId which stores LSN of last + * relation metadata update. + * Size of the cache is limited by GUC variable lastWrittenLsnCacheSize ("lsn_cache_size"), + * pages are replaced using LRU algorithm, based on L2-list. + * Access to this cache is protected by 'LastWrittenLsnLock'. + */ +static HTAB *lastWrittenLsnCache; + + +static void +lwlc_register_gucs(void) +{ + DefineCustomIntVariable("neon.lwlsn_cache_size", + "Size of last written LSN cache used by Neon", + NULL, + &lsn_cache_size, + (128*1024), -1, INT_MAX, + PGC_POSTMASTER, + 0, /* plain units */ + NULL, NULL, NULL); +} + +static XLogRecPtr SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, + RelFileLocator rlocator, + ForkNumber forknum, + BlockNumber from, + BlockNumber n_blocks); + +/* All the necessary hooks are defined here */ + +void lwlc_pre_recovery_start_hook(const ControlFileData* controlFile); + +get_lwlsn_hook_type get_lwlsn_hook = NULL; +get_lwlsn_v_hook_type get_lwlsn_v_hook = NULL; +set_lwlsn_block_range_hook_type set_lwlsn_block_range_hook = NULL; +set_lwlsn_block_v_hook_type set_lwlsn_block_v_hook = NULL; +set_lwlsn_block_hook_type set_lwlsn_block_hook = NULL; +set_lwlsn_relation_hook_type set_lwlsn_relation_hook = NULL; +set_lwlsn_db_hook_type set_lwlsn_db_hook = NULL; + +static shmem_startup_hook prev_shmem_startup_hook; +static shmem_request_hook prev_shmem_request_hook; + +void +pg_init_lwlc(void) +{ + if (!process_shared_preload_libraries_in_progress) + return; + + lwlc_register_gucs(); + + INSTALL_HOOK(shmem_startup_hook, shmeminit); + + INSTALL_HOOK(get_lwlsn_hook, neon_get_lwlsn_hook); + INSTALL_HOOK(get_lwlsn_v_hook, neon_get_lwlsn_v_hook); + INSTALL_HOOK(set_lwlsn_block_range_hook, neon_set_lwlsn_block_range_hook); + INSTALL_HOOK(set_lwlsn_block_v_hook, neon_set_lwlsn_block_v_hook); + INSTALL_HOOK(set_lwlsn_block_hook, neon_set_lwlsn_block_hook); + INSTALL_HOOK(set_lwlsn_relation_hook, neon_set_lwlsn_relation_hook); + INSTALL_HOOK(set_lwlsn_db_hook, neon_set_lwlsn_db_hook); + +#if PG_VERSION_NUM >= 150000 + INSTALL_HOOK(shmem_request_hook, shmemrequest); +#else + shmemrequest(); +#endif + + INSTALL_HOOK(xlog_pre_recovery_start_hook, lwlc_pre_recovery_start_hook); +} + +// TODO: Finish this function +void shmemrequest(void) { + +} + +void shmeminit(void) { + // TODO: Why do we need this check? Do we still do it? +//if (lastWrittenLsnCacheSize > 0) +// { + if (prev_shmem_startup_hook) { + prev_shmem_startup_hook(); + } + + static HASHCTL info; + info.keysize = sizeof(BufferTag); + info.entrysize = sizeof(LastWrittenLsnCacheEntry); + lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", + lastWrittenLsnCacheSize, lastWrittenLsnCacheSize, + &info, + HASH_ELEM | HASH_BLOBS); + +// } + dlist_init(&lastWrittenLsnLRU); + maxLastWrittenLsn = GetRedoRecPtr(); +} + +/* + * GetLastWrittenLSN -- Returns maximal LSN of written page. + * It returns an upper bound for the last written LSN of a given page, + * either from a cached last written LSN or a global maximum last written LSN. + * If rnode is InvalidOid then we calculate maximum among all cached LSN and maxLastWrittenLsn. + * If cache is large enough, iterating through all hash items may be rather expensive. + * But GetLastWrittenLSN(InvalidOid) is used only by neon_dbsize which is not performance critical. + */ +XLogRecPtr +GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) +{ + XLogRecPtr lsn; + LastWrittenLsnCacheEntry* entry; + + Assert(lastWrittenLsnCacheSize != 0); + + LWLockAcquire(LastWrittenLsnLock, LW_SHARED); + + /* Maximal last written LSN among all non-cached pages */ + lsn = maxLastWrittenLsn; + + if (rlocator.relNumber != InvalidOid) + { + BufferTag key; + key.spcOid = rlocator.spcOid; + key.dbOid = rlocator.dbOid; + key.relNumber = rlocator.relNumber; + key.forkNum = forknum; + key.blockNum = blkno; + entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL); + if (entry != NULL) + lsn = entry->lsn; + else + { + LWLockRelease(LastWrittenLsnLock); + LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); + /* + * In case of statements CREATE TABLE AS SELECT... or INSERT FROM SELECT... we are fetching data from source table + * and storing it in destination table. It cause problems with prefetch last-written-lsn is known for the pages of + * source table (which for example happens after compute restart). In this case we get get global value of + * last-written-lsn which is changed frequently as far as we are writing pages of destination table. + * As a result request-lsn for the prefetch and request-let when this page is actually needed are different + * and we got exported prefetch request. So it actually disarms prefetch. + * To prevent that, we re-insert the page with the latest LSN, so that it's + * less likely the LSN for this page will get evicted from the LwLsnCache + * before the page is read. + */ + lsn = SetLastWrittenLSNForBlockRangeInternal(lsn, rlocator, forknum, blkno, 1); + } + } + else + { + HASH_SEQ_STATUS seq; + /* Find maximum of all cached LSNs */ + hash_seq_init(&seq, lastWrittenLsnCache); + while ((entry = (LastWrittenLsnCacheEntry *) hash_seq_search(&seq)) != NULL) + { + if (entry->lsn > lsn) + lsn = entry->lsn; + } + } + LWLockRelease(LastWrittenLsnLock); + + return lsn; +} + +/* + * GetLastWrittenLSN -- Returns maximal LSN of written page. + * It returns an upper bound for the last written LSN of a given page, + * either from a cached last written LSN or a global maximum last written LSN. + * If rnode is InvalidOid then we calculate maximum among all cached LSN and maxLastWrittenLsn. + * If cache is large enough, iterating through all hash items may be rather expensive. + * But GetLastWrittenLSN(InvalidOid) is used only by neon_dbsize which is not performance critical. + */ +void +GetLastWrittenLSNv(RelFileLocator relfilenode, ForkNumber forknum, + BlockNumber blkno, int nblocks, XLogRecPtr *lsns) +{ + LastWrittenLsnCacheEntry* entry; + XLogRecPtr lsn; + + Assert(lastWrittenLsnCacheSize != 0); + Assert(nblocks > 0); + Assert(PointerIsValid(lsns)); + + LWLockAcquire(LastWrittenLsnLock, LW_SHARED); + + if (relfilenode.relNumber != InvalidOid) + { + BufferTag key; + bool missed_keys = false; + + key.spcOid = relfilenode.spcOid; + key.dbOid = relfilenode.dbOid; + key.relNumber = relfilenode.relNumber; + key.forkNum = forknum; + + for (int i = 0; i < nblocks; i++) + { + /* Maximal last written LSN among all non-cached pages */ + key.blockNum = blkno + i; + + entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL); + if (entry != NULL) + { + lsns[i] = entry->lsn; + } + else + { + /* Mark this block's LSN as missing - we'll update the LwLSN for missing blocks in bulk later */ + lsns[i] = InvalidXLogRecPtr; + missed_keys = true; + } + } + + /* + * If we had any missing LwLSN entries, we add the missing ones now. + * By doing the insertions in one batch, we decrease lock contention. + */ + if (missed_keys) + { + LWLockRelease(LastWrittenLsnLock); + LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); + + lsn = maxLastWrittenLsn; + + for (int i = 0; i < nblocks; i++) + { + if (lsns[i] == InvalidXLogRecPtr) + { + lsns[i] = lsn; + SetLastWrittenLSNForBlockRangeInternal(lsn, relfilenode, forknum, blkno + i, 1); + } + } + } + } + else + { + HASH_SEQ_STATUS seq; + lsn = maxLastWrittenLsn; + /* Find maximum of all cached LSNs */ + hash_seq_init(&seq, lastWrittenLsnCache); + while ((entry = (LastWrittenLsnCacheEntry *) hash_seq_search(&seq)) != NULL) + { + if (entry->lsn > lsn) + lsn = entry->lsn; + } + + for (int i = 0; i < nblocks; i++) + lsns[i] = lsn; + } + LWLockRelease(LastWrittenLsnLock); +} + +/* + * Guts for SetLastWrittenLSNForBlockRange. + * Caller must ensure LastWrittenLsnLock is held in exclusive mode. + */ +static XLogRecPtr +SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, + RelFileLocator rlocator, + ForkNumber forknum, + BlockNumber from, + BlockNumber n_blocks) +{ + if (rlocator.relNumber == InvalidOid) + { + if (lsn > maxLastWrittenLsn) + maxLastWrittenLsn = lsn; + else + lsn = maxLastWrittenLsn; + } + else + { + LastWrittenLsnCacheEntry* entry; + BufferTag key; + bool found; + BlockNumber i; + + key.spcOid = rlocator.spcOid; + key.dbOid = rlocator.dbOid; + key.relNumber = rlocator.relNumber; + key.forkNum = forknum; + for (i = 0; i < n_blocks; i++) + { + key.blockNum = from + i; + entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found); + if (found) + { + if (lsn > entry->lsn) + entry->lsn = lsn; + else + lsn = entry->lsn; + /* Unlink from LRU list */ + dlist_delete(&entry->lru_node); + } + else + { + entry->lsn = lsn; + if (hash_get_num_entries(lastWrittenLsnCache) > lastWrittenLsnCacheSize) + { + /* Replace least recently used entry */ + LastWrittenLsnCacheEntry* victim = dlist_container(LastWrittenLsnCacheEntry, lru_node, dlist_pop_head_node(&lastWrittenLsnLRU)); + /* Adjust max LSN for not cached relations/chunks if needed */ + if (victim->lsn > maxLastWrittenLsn) + maxLastWrittenLsn = victim->lsn; + + hash_search(lastWrittenLsnCache, victim, HASH_REMOVE, NULL); + } + } + /* Link to the end of LRU list */ + dlist_push_tail(&lastWrittenLsnLRU, &entry->lru_node); + } + } + return lsn; +} + +/* + * SetLastWrittenLSNForBlockRange -- Set maximal LSN of written page range. + * We maintain cache of last written LSNs with limited size and LRU replacement + * policy. Keeping last written LSN for each page allows to use old LSN when + * requesting pages of unchanged or appended relations. Also it is critical for + * efficient work of prefetch in case massive update operations (like vacuum or remove). + * + * rlocator.relNumber can be InvalidOid, in this case maxLastWrittenLsn is updated. + * SetLastWrittenLsn with dummy rlocator is used by createdb and dbase_redo functions. + */ +XLogRecPtr +SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) +{ + if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0) + return lsn; + + LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); + lsn = SetLastWrittenLSNForBlockRangeInternal(lsn, rlocator, forknum, from, n_blocks); + LWLockRelease(LastWrittenLsnLock); + + return lsn; +} + +/* + * SetLastWrittenLSNForBlockv -- Set maximal LSN of pages to their respective + * LSNs. + * + * We maintain cache of last written LSNs with limited size and LRU replacement + * policy. Keeping last written LSN for each page allows to use old LSN when + * requesting pages of unchanged or appended relations. Also it is critical for + * efficient work of prefetch in case massive update operations (like vacuum or remove). + */ +XLogRecPtr +SetLastWrittenLSNForBlockv(const XLogRecPtr *lsns, RelFileLocator relfilenode, + ForkNumber forknum, BlockNumber blockno, + int nblocks) +{ + LastWrittenLsnCacheEntry* entry; + BufferTag key; + bool found; + XLogRecPtr max = InvalidXLogRecPtr; + + if (lsns == NULL || nblocks == 0 || lastWrittenLsnCacheSize == 0 || + relfilenode.relNumber == InvalidOid) + return InvalidXLogRecPtr; + + key.relNumber = relfilenode.relNumber; + key.dbOid = relfilenode.dbOid; + key.spcOid = relfilenode.spcOid; + key.forkNum = forknum; + + LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); + + for (int i = 0; i < nblocks; i++) + { + XLogRecPtr lsn = lsns[i]; + + key.blockNum = blockno + i; + entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found); + if (found) + { + if (lsn > entry->lsn) + entry->lsn = lsn; + else + lsn = entry->lsn; + /* Unlink from LRU list */ + dlist_delete(&entry->lru_node); + } + else + { + entry->lsn = lsn; + if (hash_get_num_entries(lastWrittenLsnCache) > lastWrittenLsnCacheSize) + { + /* Replace least recently used entry */ + LastWrittenLsnCacheEntry* victim = dlist_container(LastWrittenLsnCacheEntry, lru_node, dlist_pop_head_node(&lastWrittenLsnLRU)); + /* Adjust max LSN for not cached relations/chunks if needed */ + if (victim->lsn > maxLastWrittenLsn) + maxLastWrittenLsn = victim->lsn; + + hash_search(lastWrittenLsnCache, victim, HASH_REMOVE, NULL); + } + } + /* Link to the end of LRU list */ + dlist_push_tail(&lastWrittenLsnLRU, &entry->lru_node); + max = Max(max, lsn); + } + + LWLockRelease(LastWrittenLsnLock); + + return max; +} + +/* + * SetLastWrittenLSNForBlock -- Set maximal LSN for block + */ +XLogRecPtr +SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) +{ + return SetLastWrittenLSNForBlockRange(lsn, rlocator, forknum, blkno, 1); +} + +/* + * SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata + */ +XLogRecPtr +SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum) +{ + return SetLastWrittenLSNForBlock(lsn, rlocator, forknum, REL_METADATA_PSEUDO_BLOCKNO); +} + +/* + * SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database + */ +XLogRecPtr +SetLastWrittenLSNForDatabase(XLogRecPtr lsn) +{ + RelFileLocator dummyNode = {InvalidOid, InvalidOid, InvalidOid}; + return SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0); +} \ No newline at end of file diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h new file mode 100644 index 000000000000..30b3799ca7c6 --- /dev/null +++ b/pgxn/neon/neon_lwlc.h @@ -0,0 +1,14 @@ + +#ifndef NEON_NEON_LWLSNCACHE_H +#define NEON_NEON_LWLSNCACHE_H + +extern int lastWrittenLsnCacheSize; + +/* Hooks */ +XLogRecPtr neon_get_lwlsn_hook(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); +void neon_get_lwlsn_v_hook(RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); +XLogRecPtr neon_set_lwlsn_block_range_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); +XLogRecPtr neon_set_lwlsn_block_v_hook set_lwlsn_block_v_hook(const XLogRecPtr *lsns, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); +XLogRecPtr neon_set_lwlsn_block_hook set_lwlsn_block_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); +XLogRecPtr neon_set_lwlsn_relation_hook set_lwlsn_relation_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum); +XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); \ No newline at end of file diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 9b118b1cffa6..6ff50443773b 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 9b118b1cffa6e4ca0d63389b57b54d11e207e9a8 +Subproject commit 6ff50443773b69749e16da6db9d4f4b19064b4b7 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 799e7a08dd17..261ed10e9b8c 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 799e7a08dd171aa06a7395dd326f4243aaeb9f93 +Subproject commit 261ed10e9b8c8dda01ad7aefb18e944e30aa161d diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 517b8dc244ab..59b2fe851f8e 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 517b8dc244abf3e56f0089849e464af76f70b94e +Subproject commit 59b2fe851f8e0595f6c830b90ee766f4f1c17a0f From 5bb0dc8010ad368e3c774bbb393690b7089364e9 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Fri, 28 Feb 2025 13:03:11 -0500 Subject: [PATCH 02/41] corrected hook installations and added getter hook for lsn cache size --- pgxn/neon/neon_lwlc.c | 49 ++++++++++++++++++++++++------------------- pgxn/neon/neon_lwlc.h | 3 ++- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index f394df9fbebf..1fa76a0e6d8c 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -26,7 +26,7 @@ typedef struct LastWrittenLsnCacheEntry dlist_node lru_node; } LastWrittenLsnCacheEntry; -LwLSN +int lastWrittenLsnCacheSize; /* * Maximal last written LSN for pages not present in lastWrittenLsnCache */ @@ -52,7 +52,7 @@ static HTAB *lastWrittenLsnCache; static void lwlc_register_gucs(void) { - DefineCustomIntVariable("neon.lwlsn_cache_size", + DefineCustomIntVariable("neon.last_written_lsn_cache_size", "Size of last written LSN cache used by Neon", NULL, &lsn_cache_size, @@ -69,16 +69,18 @@ static XLogRecPtr SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, BlockNumber n_blocks); /* All the necessary hooks are defined here */ - + // TODO: Need to see how to define this void lwlc_pre_recovery_start_hook(const ControlFileData* controlFile); -get_lwlsn_hook_type get_lwlsn_hook = NULL; -get_lwlsn_v_hook_type get_lwlsn_v_hook = NULL; -set_lwlsn_block_range_hook_type set_lwlsn_block_range_hook = NULL; -set_lwlsn_block_v_hook_type set_lwlsn_block_v_hook = NULL; -set_lwlsn_block_hook_type set_lwlsn_block_hook = NULL; -set_lwlsn_relation_hook_type set_lwlsn_relation_hook = NULL; -set_lwlsn_db_hook_type set_lwlsn_db_hook = NULL; +// Note: these are the previous hooks +get_lwlsn_hook_type prev_get_lwlsn_hook = NULL; +get_lwlsn_v_hook_type prev_get_lwlsn_v_hook = NULL; +set_lwlsn_block_range_hook_type prev_set_lwlsn_block_range_hook = NULL; +set_lwlsn_block_v_hook_type prev_set_lwlsn_block_v_hook = NULL; +set_lwlsn_block_hook_type prev_set_lwlsn_block_hook = NULL; +set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; +set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; +get_lwlsn_cache_size_type prev_get_lwlsn_cache_size = NULL; static shmem_startup_hook prev_shmem_startup_hook; static shmem_request_hook prev_shmem_request_hook; @@ -93,13 +95,14 @@ pg_init_lwlc(void) INSTALL_HOOK(shmem_startup_hook, shmeminit); - INSTALL_HOOK(get_lwlsn_hook, neon_get_lwlsn_hook); - INSTALL_HOOK(get_lwlsn_v_hook, neon_get_lwlsn_v_hook); - INSTALL_HOOK(set_lwlsn_block_range_hook, neon_set_lwlsn_block_range_hook); - INSTALL_HOOK(set_lwlsn_block_v_hook, neon_set_lwlsn_block_v_hook); - INSTALL_HOOK(set_lwlsn_block_hook, neon_set_lwlsn_block_hook); - INSTALL_HOOK(set_lwlsn_relation_hook, neon_set_lwlsn_relation_hook); - INSTALL_HOOK(set_lwlsn_db_hook, neon_set_lwlsn_db_hook); + INSTALL_HOOK(get_lwlsn_hook, GetLastWrittenLSN); + INSTALL_HOOK(get_lwlsn_v_hook, GetLastWrittenLSNv); + INSTALL_HOOK(set_lwlsn_block_range_hook, SetLastWrittenLSNForBlockRange); + INSTALL_HOOK(set_lwlsn_block_v_hook, SetLastWrittenLSNForBlockv); + INSTALL_HOOK(set_lwlsn_block_hook, SetLastWrittenLSNForBlock); + INSTALL_HOOK(set_lwlsn_relation_hook, SetLastWrittenLSNForRelation); + INSTALL_HOOK(set_lwlsn_db_hook, SetLastWrittenLSNForDatabase); + INSTALL_HOOK(get_lwlsn_cache_size, GetLastWrittenLSNCacheSize); #if PG_VERSION_NUM >= 150000 INSTALL_HOOK(shmem_request_hook, shmemrequest); @@ -116,9 +119,9 @@ void shmemrequest(void) { } void shmeminit(void) { - // TODO: Why do we need this check? Do we still do it? -//if (lastWrittenLsnCacheSize > 0) -// { + +if (lastWrittenLsnCacheSize > 0) + { if (prev_shmem_startup_hook) { prev_shmem_startup_hook(); } @@ -131,11 +134,15 @@ void shmeminit(void) { &info, HASH_ELEM | HASH_BLOBS); -// } + } dlist_init(&lastWrittenLsnLRU); maxLastWrittenLsn = GetRedoRecPtr(); } +int GetLastWrittenLSNCacheSize (void) { + return lastWrittenLsnCacheSize; +} + /* * GetLastWrittenLSN -- Returns maximal LSN of written page. * It returns an upper bound for the last written LSN of a given page, diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 30b3799ca7c6..04426573533b 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -11,4 +11,5 @@ XLogRecPtr neon_set_lwlsn_block_range_hook(XLogRecPtr lsn, RelFileLocator rlocat XLogRecPtr neon_set_lwlsn_block_v_hook set_lwlsn_block_v_hook(const XLogRecPtr *lsns, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); XLogRecPtr neon_set_lwlsn_block_hook set_lwlsn_block_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); XLogRecPtr neon_set_lwlsn_relation_hook set_lwlsn_relation_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum); -XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); \ No newline at end of file +XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); +int GetLastWrittenLSNCacheSize(void); \ No newline at end of file From 877d6b7387c436f6b47c367c4561077e300a3ed9 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Fri, 28 Feb 2025 13:07:56 -0500 Subject: [PATCH 03/41] added lwlc_init in neon.h # Conflicts: # pgxn/neon/neon.h --- pgxn/neon/neon.h | 1 + 1 file changed, 1 insertion(+) diff --git a/pgxn/neon/neon.h b/pgxn/neon/neon.h index 7686ce076bbb..708eef34686d 100644 --- a/pgxn/neon/neon.h +++ b/pgxn/neon/neon.h @@ -50,6 +50,7 @@ extern uint32 WAIT_EVENT_NEON_WAL_DL; extern void pg_init_libpagestore(void); extern void pg_init_walproposer(void); +extern void pg_init_lwlc(void); extern void pagestore_smgr_init(void); extern uint64 BackpressureThrottlingTime(void); From 163c7de12583c6e9e0876933832e421d6ec0ff20 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Fri, 28 Feb 2025 16:34:13 -0500 Subject: [PATCH 04/41] got neon building with modified pg17 --- pgxn/neon/neon_lwlc.c | 62 +++++++++++++++++++-------------- pgxn/neon_walredo/walredoproc.c | 3 -- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 1fa76a0e6d8c..9c5edec7b65c 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -55,7 +55,7 @@ lwlc_register_gucs(void) DefineCustomIntVariable("neon.last_written_lsn_cache_size", "Size of last written LSN cache used by Neon", NULL, - &lsn_cache_size, + &lastWrittenLsnCacheSize, (128*1024), -1, INT_MAX, PGC_POSTMASTER, 0, /* plain units */ @@ -95,14 +95,14 @@ pg_init_lwlc(void) INSTALL_HOOK(shmem_startup_hook, shmeminit); - INSTALL_HOOK(get_lwlsn_hook, GetLastWrittenLSN); - INSTALL_HOOK(get_lwlsn_v_hook, GetLastWrittenLSNv); - INSTALL_HOOK(set_lwlsn_block_range_hook, SetLastWrittenLSNForBlockRange); - INSTALL_HOOK(set_lwlsn_block_v_hook, SetLastWrittenLSNForBlockv); - INSTALL_HOOK(set_lwlsn_block_hook, SetLastWrittenLSNForBlock); - INSTALL_HOOK(set_lwlsn_relation_hook, SetLastWrittenLSNForRelation); - INSTALL_HOOK(set_lwlsn_db_hook, SetLastWrittenLSNForDatabase); - INSTALL_HOOK(get_lwlsn_cache_size, GetLastWrittenLSNCacheSize); + INSTALL_HOOK(get_lwlsn_hook, neon_get_lwlsn); + INSTALL_HOOK(get_lwlsn_v_hook, neon_get_lwlsn_v); + INSTALL_HOOK(set_lwlsn_block_range_hook, neon_set_lwlsn_block_range); + INSTALL_HOOK(set_lwlsn_block_v_hook, neon_set_lwlsn_block_v); + INSTALL_HOOK(set_lwlsn_block_hook, neon_set_lwlsn_block); + INSTALL_HOOK(set_lwlsn_relation_hook, neon_set_lwlsn_relation); + INSTALL_HOOK(set_lwlsn_db_hook, neon_set_lwlsn_db); + INSTALL_HOOK(get_lwlsn_cache_size, neon_get_lwlsn_cache_size); #if PG_VERSION_NUM >= 150000 INSTALL_HOOK(shmem_request_hook, shmemrequest); @@ -113,9 +113,17 @@ pg_init_lwlc(void) INSTALL_HOOK(xlog_pre_recovery_start_hook, lwlc_pre_recovery_start_hook); } -// TODO: Finish this function void shmemrequest(void) { - + Size requested_size = sizeof(dlist_head); + + #if PG_VERSION_NUM >= 150000 + if (prev_shmem_request_hook) + prev_shmem_request_hook(); + #endif + + requested_size += hash_estimate_size(lastWrittenLsnCacheSize, sizeof(dlist_head)); + + RequestAddinShmemSpace(requested_size); } void shmeminit(void) { @@ -139,20 +147,20 @@ if (lastWrittenLsnCacheSize > 0) maxLastWrittenLsn = GetRedoRecPtr(); } -int GetLastWrittenLSNCacheSize (void) { +int neon_get_lwlsn_cache_size (void) { return lastWrittenLsnCacheSize; } /* - * GetLastWrittenLSN -- Returns maximal LSN of written page. + * neon_get_lwlsn -- Returns maximal LSN of written page. * It returns an upper bound for the last written LSN of a given page, * either from a cached last written LSN or a global maximum last written LSN. * If rnode is InvalidOid then we calculate maximum among all cached LSN and maxLastWrittenLsn. * If cache is large enough, iterating through all hash items may be rather expensive. - * But GetLastWrittenLSN(InvalidOid) is used only by neon_dbsize which is not performance critical. + * But neon_get_lwlsn(InvalidOid) is used only by neon_dbsize which is not performance critical. */ XLogRecPtr -GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) +neon_get_lwlsn(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) { XLogRecPtr lsn; LastWrittenLsnCacheEntry* entry; @@ -218,7 +226,7 @@ GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno * But GetLastWrittenLSN(InvalidOid) is used only by neon_dbsize which is not performance critical. */ void -GetLastWrittenLSNv(RelFileLocator relfilenode, ForkNumber forknum, +neon_get_lwlsn_v(RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns) { LastWrittenLsnCacheEntry* entry; @@ -371,7 +379,7 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, * SetLastWrittenLsn with dummy rlocator is used by createdb and dbase_redo functions. */ XLogRecPtr -SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) +neon_set_lwlsn_block_range(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) { if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0) return lsn; @@ -384,7 +392,7 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumb } /* - * SetLastWrittenLSNForBlockv -- Set maximal LSN of pages to their respective + * neon_set_lwlsn_block_v -- Set maximal LSN of pages to their respective * LSNs. * * We maintain cache of last written LSNs with limited size and LRU replacement @@ -393,7 +401,7 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumb * efficient work of prefetch in case massive update operations (like vacuum or remove). */ XLogRecPtr -SetLastWrittenLSNForBlockv(const XLogRecPtr *lsns, RelFileLocator relfilenode, +neon_set_lwlsn_block_v(const XLogRecPtr *lsns, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks) { @@ -456,26 +464,26 @@ SetLastWrittenLSNForBlockv(const XLogRecPtr *lsns, RelFileLocator relfilenode, * SetLastWrittenLSNForBlock -- Set maximal LSN for block */ XLogRecPtr -SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) +neon_set_lwlsn_block(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) { - return SetLastWrittenLSNForBlockRange(lsn, rlocator, forknum, blkno, 1); + return neon_set_lwlsn_block_range(lsn, rlocator, forknum, blkno, 1); } /* - * SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata + * neon_set_lwlsn_relation -- Set maximal LSN for relation metadata */ XLogRecPtr -SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum) +neon_set_lwlsn_relation(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum) { - return SetLastWrittenLSNForBlock(lsn, rlocator, forknum, REL_METADATA_PSEUDO_BLOCKNO); + return neon_set_lwlsn_block(lsn, rlocator, forknum, REL_METADATA_PSEUDO_BLOCKNO); } /* - * SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database + * neon_set_lwlsn_db -- Set maximal LSN for the whole database */ XLogRecPtr -SetLastWrittenLSNForDatabase(XLogRecPtr lsn) +neon_set_lwlsn_db(XLogRecPtr lsn) { RelFileLocator dummyNode = {InvalidOid, InvalidOid, InvalidOid}; - return SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0); + return neon_set_lwlsn_block(lsn, dummyNode, MAIN_FORKNUM, 0); } \ No newline at end of file diff --git a/pgxn/neon_walredo/walredoproc.c b/pgxn/neon_walredo/walredoproc.c index 4673de778cb3..a1be49857318 100644 --- a/pgxn/neon_walredo/walredoproc.c +++ b/pgxn/neon_walredo/walredoproc.c @@ -286,9 +286,6 @@ WalRedoMain(int argc, char *argv[]) max_wal_senders = 0; InitializeMaxBackends(); - /* Disable lastWrittenLsnCache */ - lastWrittenLsnCacheSize = 0; - #if PG_VERSION_NUM >= 150000 process_shmem_requests(); InitializeShmemGUCs(); From 4213da6a3c91f841bccfb4e2104af14a2404f804 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Fri, 28 Feb 2025 17:01:56 -0500 Subject: [PATCH 05/41] pushing changed postgres for CI test --- .gitmodules | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index d1330bf28c60..cc5a79847715 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,4 +13,4 @@ [submodule "vendor/postgres-v17"] path = vendor/postgres-v17 url = https://github.com/neondatabase/postgres.git - branch = REL_17_STABLE_neon + branch = move_lwlsn_neon_ext diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 59b2fe851f8e..5182ec38b114 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 59b2fe851f8e0595f6c830b90ee766f4f1c17a0f +Subproject commit 5182ec38b1144486c6255e456703a6ab48350c0b diff --git a/vendor/revisions.json b/vendor/revisions.json index 8dde46a01e10..dc069e890a00 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "517b8dc244abf3e56f0089849e464af76f70b94e" + "d045dcb01a7610981f303fe081a04c0ee7a75539" ], "v16": [ "16.8", From c55fc720ef2d2e1c635af44d765ee3d0d8578f37 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 10:18:51 -0500 Subject: [PATCH 06/41] fix: updated overwritten commit in revisions.json --- vendor/revisions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index dc069e890a00..9e3d12364bcc 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "d045dcb01a7610981f303fe081a04c0ee7a75539" + "af7e7e9a62305e4031c637f0af3bba551295d931" ], "v16": [ "16.8", From ba5f22b2ae1aed9e148770fbc6ad73ad895ce531 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 10:49:24 -0500 Subject: [PATCH 07/41] updated revisions.json to reflect updated postgres commit --- vendor/revisions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index 9e3d12364bcc..cbd66d17eea6 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "af7e7e9a62305e4031c637f0af3bba551295d931" + "282ca243337cfa8231e44c3c43d5dd49164c7f56" ], "v16": [ "16.8", From 2d3d9d405f0d09721fe4b28119b714740bbdd62b Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 11:44:13 -0500 Subject: [PATCH 08/41] updated revisions.json to point to commit without getter funcs (made neon-internal) --- vendor/revisions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index cbd66d17eea6..5665eabee9e6 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "282ca243337cfa8231e44c3c43d5dd49164c7f56" + "8b83aa1e01e5649be40e464222eb65eb6edba5fd" ], "v16": [ "16.8", From 6f3e9b0b1f8a9a44476c2b111ffa5ce6513e5c00 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 11:44:13 -0500 Subject: [PATCH 09/41] updated revisions.json to point to commit without getter funcs (made neon-internal) --- vendor/revisions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index cbd66d17eea6..5665eabee9e6 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "282ca243337cfa8231e44c3c43d5dd49164c7f56" + "8b83aa1e01e5649be40e464222eb65eb6edba5fd" ], "v16": [ "16.8", From 8f339e963412f9c6913bf3ce8cae317114f0bd81 Mon Sep 17 00:00:00 2001 From: Tristan Partin Date: Mon, 3 Mar 2025 12:48:16 -0600 Subject: [PATCH 10/41] Fix v15 and v16 postgres submodules --- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 6ff50443773b..9b118b1cffa6 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 6ff50443773b69749e16da6db9d4f4b19064b4b7 +Subproject commit 9b118b1cffa6e4ca0d63389b57b54d11e207e9a8 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 261ed10e9b8c..799e7a08dd17 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 261ed10e9b8c8dda01ad7aefb18e944e30aa161d +Subproject commit 799e7a08dd171aa06a7395dd326f4243aaeb9f93 From ad9942023a0e316f172a69c674264526385c0b2d Mon Sep 17 00:00:00 2001 From: Tristan Partin Date: Mon, 3 Mar 2025 13:07:39 -0600 Subject: [PATCH 11/41] Fix the v17 submodule --- vendor/postgres-v17 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 5182ec38b114..8b83aa1e01e5 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 5182ec38b1144486c6255e456703a6ab48350c0b +Subproject commit 8b83aa1e01e5649be40e464222eb65eb6edba5fd From 38e81627510c895f99e5e9b08c8b429105442260 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 14:31:22 -0500 Subject: [PATCH 12/41] updated revisions.json to point to postgres commit with updated behavior for SetLastWrittenLSNForBlockv --- vendor/revisions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index 5665eabee9e6..5c95397e31f4 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "8b83aa1e01e5649be40e464222eb65eb6edba5fd" + "623de69a47de8755e4f80bca94a0b5fe57ad6d6c" ], "v16": [ "16.8", From 6afd98326bb4c0d480f5f27f757eca7518b43e6a Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 14:51:08 -0500 Subject: [PATCH 13/41] updated pg v17 --- vendor/postgres-v17 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 8b83aa1e01e5..623de69a47de 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 8b83aa1e01e5649be40e464222eb65eb6edba5fd +Subproject commit 623de69a47de8755e4f80bca94a0b5fe57ad6d6c From 31426e3c1ea2d68261871d03748f0f148d6681d4 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 15:17:25 -0500 Subject: [PATCH 14/41] updated references to lwlsn func calls in pg v17 to use neon extension --- pgxn/neon/file_cache.c | 9 +++++++++ pgxn/neon/neon_lwlc.h | 10 +++------- pgxn/neon/pagestore_smgr.c | 10 +++++++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/pgxn/neon/file_cache.c b/pgxn/neon/file_cache.c index f6a577abfca0..8eb3b6c98812 100644 --- a/pgxn/neon/file_cache.c +++ b/pgxn/neon/file_cache.c @@ -50,6 +50,10 @@ #include "neon.h" #include "neon_perf_counters.h" +#if PG_VERSION_NUM >= 170000 +#include "neon_lwlc.h" +#endif + #define CriticalAssert(cond) do if (!(cond)) elog(PANIC, "LFC: assertion %s failed at %s:%d: ", #cond, __FILE__, __LINE__); while (0) /* @@ -999,7 +1003,12 @@ lfc_prefetch(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, LWLockRelease(lfc_lock); return false; } + #if PG_VERSION_NUM >= 170000 + lwlsn = get_lwlsn_hook(rinfo, forknum, blkno); + #else lwlsn = GetLastWrittenLSN(rinfo, forknum, blkno); + #endif + if (lwlsn > lsn) { elog(DEBUG1, "Skip LFC write for %d because LwLSN=%X/%X is greater than not_nodified_since LSN %X/%X", diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 04426573533b..18f58d8a7e85 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,15 +1,11 @@ - -#ifndef NEON_NEON_LWLSNCACHE_H -#define NEON_NEON_LWLSNCACHE_H - extern int lastWrittenLsnCacheSize; /* Hooks */ XLogRecPtr neon_get_lwlsn_hook(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); void neon_get_lwlsn_v_hook(RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); XLogRecPtr neon_set_lwlsn_block_range_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); -XLogRecPtr neon_set_lwlsn_block_v_hook set_lwlsn_block_v_hook(const XLogRecPtr *lsns, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); -XLogRecPtr neon_set_lwlsn_block_hook set_lwlsn_block_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); -XLogRecPtr neon_set_lwlsn_relation_hook set_lwlsn_relation_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum); +XLogRecPtr neon_set_lwlsn_block_v_hook(const XLogRecPtr *lsns, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); +XLogRecPtr neon_set_lwlsn_block_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); +XLogRecPtr neon_set_lwlsn_relation_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum); XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); int GetLastWrittenLSNCacheSize(void); \ No newline at end of file diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index fe463fd4a65f..1f051de0f422 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -76,6 +76,10 @@ #include "access/xlogrecovery.h" #endif +#if PG_VERSION_NUM >= 170000 +#include "neon_lwlc.h" +#endif + /* * If DEBUG_COMPARE_LOCAL is defined, we pass through all the SMGR API * calls to md.c, and *also* do the calls to the Page Server. On every @@ -2224,8 +2228,12 @@ neon_get_request_lsns(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, Assert(nblocks <= PG_IOV_MAX); + #if PG_MAJORVERSION_NUM < 17 GetLastWrittenLSNv(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); - + #else + get_lwlsn_v_hook(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); + #endif + for (int i = 0; i < nblocks; i++) { last_written_lsns[i] = nm_adjust_lsn(last_written_lsns[i]); From 3b6297ee9f4b22483edf1425c37fef88c78268fd Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 3 Mar 2025 15:33:40 -0500 Subject: [PATCH 15/41] added pg check for disabling lwlsn cache in walredoproc --- pgxn/neon_walredo/walredoproc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pgxn/neon_walredo/walredoproc.c b/pgxn/neon_walredo/walredoproc.c index a1be49857318..29b54f537137 100644 --- a/pgxn/neon_walredo/walredoproc.c +++ b/pgxn/neon_walredo/walredoproc.c @@ -286,6 +286,11 @@ WalRedoMain(int argc, char *argv[]) max_wal_senders = 0; InitializeMaxBackends(); + #if PG_VERSION_NUM < 170000 + /* Disable lastWrittenLsnCache */ + lastWrittenLsnCacheSize = 0; + #endif + #if PG_VERSION_NUM >= 150000 process_shmem_requests(); InitializeShmemGUCs(); From 64ab566b11b7bd2b9beac8df78f506cb46b7cbe5 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 4 Mar 2025 13:05:09 -0500 Subject: [PATCH 16/41] addressed comments and updated function names, calling init_lwlc() in neon ext setup --- pgxn/neon/neon.c | 6 ++++++ pgxn/neon/neon.h | 1 - pgxn/neon/neon_lwlc.c | 22 +++++++++++----------- pgxn/neon/neon_lwlc.h | 2 ++ 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/pgxn/neon/neon.c b/pgxn/neon/neon.c index 4b448ba5f60a..60e8f897756d 100644 --- a/pgxn/neon/neon.c +++ b/pgxn/neon/neon.c @@ -40,6 +40,9 @@ #if PG_MAJORVERSION_NUM >= 16 #include "storage/ipc.h" #endif +#if PG_MAJORVERSION_NUM >= 17 +#include "neon_lwlc.h" +#endif PG_MODULE_MAGIC; void _PG_init(void); @@ -437,6 +440,9 @@ _PG_init(void) pg_init_libpagestore(); pg_init_walproposer(); + #if PG_MAJORVERSION_NUM >= 17 + init_lwlc(); + #endif pagestore_smgr_init(); Custom_XLogReaderRoutines = NeonOnDemandXLogReaderRoutines; diff --git a/pgxn/neon/neon.h b/pgxn/neon/neon.h index 708eef34686d..7686ce076bbb 100644 --- a/pgxn/neon/neon.h +++ b/pgxn/neon/neon.h @@ -50,7 +50,6 @@ extern uint32 WAIT_EVENT_NEON_WAL_DL; extern void pg_init_libpagestore(void); extern void pg_init_walproposer(void); -extern void pg_init_lwlc(void); extern void pagestore_smgr_init(void); extern uint64 BackpressureThrottlingTime(void); diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 9c5edec7b65c..8a87792eb2ee 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -73,23 +73,23 @@ static XLogRecPtr SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, void lwlc_pre_recovery_start_hook(const ControlFileData* controlFile); // Note: these are the previous hooks -get_lwlsn_hook_type prev_get_lwlsn_hook = NULL; -get_lwlsn_v_hook_type prev_get_lwlsn_v_hook = NULL; -set_lwlsn_block_range_hook_type prev_set_lwlsn_block_range_hook = NULL; -set_lwlsn_block_v_hook_type prev_set_lwlsn_block_v_hook = NULL; -set_lwlsn_block_hook_type prev_set_lwlsn_block_hook = NULL; -set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; -set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; -get_lwlsn_cache_size_type prev_get_lwlsn_cache_size = NULL; +static get_lwlsn_hook_type prev_get_lwlsn_hook = NULL; +static get_lwlsn_v_hook_type prev_get_lwlsn_v_hook = NULL; +static set_lwlsn_block_range_hook_type prev_set_lwlsn_block_range_hook = NULL; +static set_lwlsn_block_v_hook_type prev_set_lwlsn_block_v_hook = NULL; +static set_lwlsn_block_hook_type prev_set_lwlsn_block_hook = NULL; +static set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; +static set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; +static get_lwlsn_cache_size_type prev_get_lwlsn_cache_size = NULL; static shmem_startup_hook prev_shmem_startup_hook; static shmem_request_hook prev_shmem_request_hook; void -pg_init_lwlc(void) +init_lwlc(void) { if (!process_shared_preload_libraries_in_progress) - return; + return ERROR; lwlc_register_gucs(); @@ -121,7 +121,7 @@ void shmemrequest(void) { prev_shmem_request_hook(); #endif - requested_size += hash_estimate_size(lastWrittenLsnCacheSize, sizeof(dlist_head)); + requested_size += hash_estimate_size(lastWrittenLsnCacheSize, sizeof(LastWrittenLsnCacheEntry)); RequestAddinShmemSpace(requested_size); } diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 18f58d8a7e85..8e0d6e04e0b3 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,5 +1,7 @@ extern int lastWrittenLsnCacheSize; +extern void init_lwlc(void); + /* Hooks */ XLogRecPtr neon_get_lwlsn_hook(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); void neon_get_lwlsn_v_hook(RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); From c18f15ccd12c23e4bac3acce38918c3e856dc600 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 4 Mar 2025 13:06:04 -0500 Subject: [PATCH 17/41] pointing to new pg17 --- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 623de69a47de..24595554c8c3 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 623de69a47de8755e4f80bca94a0b5fe57ad6d6c +Subproject commit 24595554c8c3ec7e0082428d436041d58962ee89 diff --git a/vendor/revisions.json b/vendor/revisions.json index 5c95397e31f4..dc681c12b9b8 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "623de69a47de8755e4f80bca94a0b5fe57ad6d6c" + "24595554c8c3ec7e0082428d436041d58962ee89" ], "v16": [ "16.8", From 613c9d8c1ac5588fa42f414b833936561b0bfb7d Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 4 Mar 2025 14:55:40 -0500 Subject: [PATCH 18/41] added include guards and pg agnostic data types in neon_lwlc --- pgxn/neon/neon.c | 4 ++-- pgxn/neon/neon_lwlc.c | 29 +++++++++++++++++------------ pgxn/neon/neon_lwlc.h | 23 +++++++++++++++-------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/pgxn/neon/neon.c b/pgxn/neon/neon.c index 60e8f897756d..1429d26a0434 100644 --- a/pgxn/neon/neon.c +++ b/pgxn/neon/neon.c @@ -440,9 +440,9 @@ _PG_init(void) pg_init_libpagestore(); pg_init_walproposer(); - #if PG_MAJORVERSION_NUM >= 17 +#if PG_VERSION_NUM >= 170000 init_lwlc(); - #endif +#endif pagestore_smgr_init(); Custom_XLogReaderRoutines = NeonOnDemandXLogReaderRoutines; diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 8a87792eb2ee..ffc8e4c639e4 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -1,8 +1,11 @@ -#include "neon_lwlc.h" +#if PG_MAJORVERSION_NUM >= 17 + #include "postgres.h" +#include "neon_lwlc.h" #include "access/xlog.h" #include "storage/shmem.h" #include "storage/buf_internals.h" +#include "utils/guc.h" #define INSTALL_HOOK(name, function) \ @@ -56,14 +59,14 @@ lwlc_register_gucs(void) "Size of last written LSN cache used by Neon", NULL, &lastWrittenLsnCacheSize, - (128*1024), -1, INT_MAX, + (128*1024), 1024, INT_MAX, PGC_POSTMASTER, 0, /* plain units */ NULL, NULL, NULL); } static XLogRecPtr SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, - RelFileLocator rlocator, + NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); @@ -160,7 +163,7 @@ int neon_get_lwlsn_cache_size (void) { * But neon_get_lwlsn(InvalidOid) is used only by neon_dbsize which is not performance critical. */ XLogRecPtr -neon_get_lwlsn(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) +neon_get_lwlsn(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno) { XLogRecPtr lsn; LastWrittenLsnCacheEntry* entry; @@ -226,7 +229,7 @@ neon_get_lwlsn(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) * But GetLastWrittenLSN(InvalidOid) is used only by neon_dbsize which is not performance critical. */ void -neon_get_lwlsn_v(RelFileLocator relfilenode, ForkNumber forknum, +neon_get_lwlsn_v(NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns) { LastWrittenLsnCacheEntry* entry; @@ -311,7 +314,7 @@ neon_get_lwlsn_v(RelFileLocator relfilenode, ForkNumber forknum, */ static XLogRecPtr SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, - RelFileLocator rlocator, + NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) @@ -379,7 +382,7 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, * SetLastWrittenLsn with dummy rlocator is used by createdb and dbase_redo functions. */ XLogRecPtr -neon_set_lwlsn_block_range(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) +neon_set_lwlsn_block_range(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) { if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0) return lsn; @@ -401,7 +404,7 @@ neon_set_lwlsn_block_range(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber f * efficient work of prefetch in case massive update operations (like vacuum or remove). */ XLogRecPtr -neon_set_lwlsn_block_v(const XLogRecPtr *lsns, RelFileLocator relfilenode, +neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks) { @@ -464,7 +467,7 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, RelFileLocator relfilenode, * SetLastWrittenLSNForBlock -- Set maximal LSN for block */ XLogRecPtr -neon_set_lwlsn_block(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno) +neon_set_lwlsn_block(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno) { return neon_set_lwlsn_block_range(lsn, rlocator, forknum, blkno, 1); } @@ -473,7 +476,7 @@ neon_set_lwlsn_block(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum * neon_set_lwlsn_relation -- Set maximal LSN for relation metadata */ XLogRecPtr -neon_set_lwlsn_relation(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum) +neon_set_lwlsn_relation(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum) { return neon_set_lwlsn_block(lsn, rlocator, forknum, REL_METADATA_PSEUDO_BLOCKNO); } @@ -484,6 +487,8 @@ neon_set_lwlsn_relation(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber fork XLogRecPtr neon_set_lwlsn_db(XLogRecPtr lsn) { - RelFileLocator dummyNode = {InvalidOid, InvalidOid, InvalidOid}; + NRelFileInfo dummyNode = {InvalidOid, InvalidOid, InvalidOid}; return neon_set_lwlsn_block(lsn, dummyNode, MAIN_FORKNUM, 0); -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 8e0d6e04e0b3..df4bb89d473f 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,13 +1,20 @@ +#include "neon_pgversioncompat.h" + +#ifndef NEON_LWLSN_CACHE +#define NEON_LWLSN_CACHE + extern int lastWrittenLsnCacheSize; -extern void init_lwlc(void); +void init_lwlc(void); /* Hooks */ -XLogRecPtr neon_get_lwlsn_hook(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); -void neon_get_lwlsn_v_hook(RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); -XLogRecPtr neon_set_lwlsn_block_range_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); -XLogRecPtr neon_set_lwlsn_block_v_hook(const XLogRecPtr *lsns, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); -XLogRecPtr neon_set_lwlsn_block_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno); -XLogRecPtr neon_set_lwlsn_relation_hook(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum); +XLogRecPtr neon_get_lwlsn_hook(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); +void neon_get_lwlsn_v_hook(NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); +XLogRecPtr neon_set_lwlsn_block_range_hook(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); +XLogRecPtr neon_set_lwlsn_block_v_hook(const XLogRecPtr *lsns, NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); +XLogRecPtr neon_set_lwlsn_block_hook(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); +XLogRecPtr neon_set_lwlsn_relation_hook(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum); XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); -int GetLastWrittenLSNCacheSize(void); \ No newline at end of file +int GetLastWrittenLSNCacheSize(void); + +#endif \ No newline at end of file From 13576ef111e9931fb061bc1b3b25e1f8198f0b3e Mon Sep 17 00:00:00 2001 From: Tristan Partin Date: Tue, 4 Mar 2025 14:08:05 -0600 Subject: [PATCH 19/41] Fix build issues --- pgxn/neon/file_cache.c | 2 +- pgxn/neon/neon_lwlc.c | 18 +++++++++++++----- pgxn/neon/neon_lwlc.h | 8 ++++---- pgxn/neon/pagestore_smgr.c | 10 +++++----- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/pgxn/neon/file_cache.c b/pgxn/neon/file_cache.c index 8eb3b6c98812..868717131563 100644 --- a/pgxn/neon/file_cache.c +++ b/pgxn/neon/file_cache.c @@ -1004,7 +1004,7 @@ lfc_prefetch(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, return false; } #if PG_VERSION_NUM >= 170000 - lwlsn = get_lwlsn_hook(rinfo, forknum, blkno); + lwlsn = neon_get_lwlsn_hook(rinfo, forknum, blkno); #else lwlsn = GetLastWrittenLSN(rinfo, forknum, blkno); #endif diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index ffc8e4c639e4..1277472d6e31 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -1,7 +1,9 @@ -#if PG_MAJORVERSION_NUM >= 17 - #include "postgres.h" + #include "neon_lwlc.h" + +#if PG_MAJORVERSION_NUM >= 170000 + #include "access/xlog.h" #include "storage/shmem.h" #include "storage/buf_internals.h" @@ -123,9 +125,9 @@ void shmemrequest(void) { if (prev_shmem_request_hook) prev_shmem_request_hook(); #endif - + requested_size += hash_estimate_size(lastWrittenLsnCacheSize, sizeof(LastWrittenLsnCacheEntry)); - + RequestAddinShmemSpace(requested_size); } @@ -491,4 +493,10 @@ neon_set_lwlsn_db(XLogRecPtr lsn) return neon_set_lwlsn_block(lsn, dummyNode, MAIN_FORKNUM, 0); } -#endif \ No newline at end of file +#else + +void +init_lwlc(void) +{} + +#endif diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index df4bb89d473f..4c3a38f41c76 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,7 +1,7 @@ -#include "neon_pgversioncompat.h" +#ifndef NEON_LWLC_H +#define NEON_LWLC_H -#ifndef NEON_LWLSN_CACHE -#define NEON_LWLSN_CACHE +#include "neon_pgversioncompat.h" extern int lastWrittenLsnCacheSize; @@ -17,4 +17,4 @@ XLogRecPtr neon_set_lwlsn_relation_hook(XLogRecPtr lsn, NRelFileInfo rlocator, F XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); int GetLastWrittenLSNCacheSize(void); -#endif \ No newline at end of file +#endif diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index 1f051de0f422..d7f394235c2b 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -864,7 +864,7 @@ prefetch_on_ps_disconnect(void) /* * We can have gone into retry due to network error, so update stats with - * the latest available + * the latest available */ MyNeonCounters->pageserver_open_requests = MyPState->n_requests_inflight; @@ -1092,7 +1092,7 @@ prefetch_register_bufferv(BufferTag tag, neon_request_lsns *frlsns, Retry: /* * We can have gone into retry due to network error, so update stats with - * the latest available + * the latest available */ MyNeonCounters->pageserver_open_requests = MyPState->ring_unused - MyPState->ring_receive; @@ -2231,9 +2231,9 @@ neon_get_request_lsns(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, #if PG_MAJORVERSION_NUM < 17 GetLastWrittenLSNv(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); #else - get_lwlsn_v_hook(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); + neon_get_lwlsn_v_hook(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); #endif - + for (int i = 0; i < nblocks; i++) { last_written_lsns[i] = nm_adjust_lsn(last_written_lsns[i]); @@ -3599,7 +3599,7 @@ neon_readv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, /* assume btree */ RmgrTable[RM_BTREE_ID].rm_mask(mdbuf_masked, blkno); RmgrTable[RM_BTREE_ID].rm_mask(pageserver_masked, blkno); - + if (memcmp(mdbuf_masked, pageserver_masked, BLCKSZ) != 0) { neon_log(PANIC, "btree buffers differ at blk %u in rel %u/%u/%u fork %u (request LSN %X/%08X):\n------ MD ------\n%s\n------ Page Server ------\n%s\n", From e220863fa5a08fd4eff1941f4bb45d707c85e30a Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 4 Mar 2025 15:27:04 -0500 Subject: [PATCH 20/41] fixed build issues and warnings --- pgxn/neon/Makefile | 1 + pgxn/neon/file_cache.c | 2 +- pgxn/neon/neon_lwlc.c | 21 ++++++++------------- pgxn/neon/neon_lwlc.h | 16 +++++++++------- pgxn/neon/pagestore_smgr.c | 2 +- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/pgxn/neon/Makefile b/pgxn/neon/Makefile index c87ae59fd6af..44c897d46b3e 100644 --- a/pgxn/neon/Makefile +++ b/pgxn/neon/Makefile @@ -10,6 +10,7 @@ OBJS = \ libpagestore.o \ logical_replication_monitor.o \ neon.o \ + neon_lwlc.o \ neon_pgversioncompat.o \ neon_perf_counters.o \ neon_utils.o \ diff --git a/pgxn/neon/file_cache.c b/pgxn/neon/file_cache.c index 868717131563..b2577d30e5a8 100644 --- a/pgxn/neon/file_cache.c +++ b/pgxn/neon/file_cache.c @@ -1004,7 +1004,7 @@ lfc_prefetch(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, return false; } #if PG_VERSION_NUM >= 170000 - lwlsn = neon_get_lwlsn_hook(rinfo, forknum, blkno); + lwlsn = neon_get_lwlsn(rinfo, forknum, blkno); #else lwlsn = GetLastWrittenLSN(rinfo, forknum, blkno); #endif diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 1277472d6e31..3f008c65606b 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -2,12 +2,14 @@ #include "neon_lwlc.h" -#if PG_MAJORVERSION_NUM >= 170000 +#if PG_MAJORVERSION_NUM >= 17 #include "access/xlog.h" +#include "storage/ipc.h" #include "storage/shmem.h" #include "storage/buf_internals.h" #include "utils/guc.h" +#include "utils/hsearch.h" #define INSTALL_HOOK(name, function) \ @@ -85,16 +87,15 @@ static set_lwlsn_block_v_hook_type prev_set_lwlsn_block_v_hook = NULL; static set_lwlsn_block_hook_type prev_set_lwlsn_block_hook = NULL; static set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; static set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; -static get_lwlsn_cache_size_type prev_get_lwlsn_cache_size = NULL; -static shmem_startup_hook prev_shmem_startup_hook; -static shmem_request_hook prev_shmem_request_hook; +static shmem_startup_hook_type prev_shmem_startup_hook; +static shmem_request_hook_type prev_shmem_request_hook; void init_lwlc(void) { if (!process_shared_preload_libraries_in_progress) - return ERROR; + return; lwlc_register_gucs(); @@ -107,7 +108,6 @@ init_lwlc(void) INSTALL_HOOK(set_lwlsn_block_hook, neon_set_lwlsn_block); INSTALL_HOOK(set_lwlsn_relation_hook, neon_set_lwlsn_relation); INSTALL_HOOK(set_lwlsn_db_hook, neon_set_lwlsn_db); - INSTALL_HOOK(get_lwlsn_cache_size, neon_get_lwlsn_cache_size); #if PG_VERSION_NUM >= 150000 INSTALL_HOOK(shmem_request_hook, shmemrequest); @@ -115,7 +115,7 @@ init_lwlc(void) shmemrequest(); #endif - INSTALL_HOOK(xlog_pre_recovery_start_hook, lwlc_pre_recovery_start_hook); + // INSTALL_HOOK(xlog_pre_recovery_start_hook, lwlc_pre_recovery_start_hook); } void shmemrequest(void) { @@ -132,13 +132,12 @@ void shmemrequest(void) { } void shmeminit(void) { - if (lastWrittenLsnCacheSize > 0) { if (prev_shmem_startup_hook) { prev_shmem_startup_hook(); } - + static HASHCTL info; info.keysize = sizeof(BufferTag); info.entrysize = sizeof(LastWrittenLsnCacheEntry); @@ -152,10 +151,6 @@ if (lastWrittenLsnCacheSize > 0) maxLastWrittenLsn = GetRedoRecPtr(); } -int neon_get_lwlsn_cache_size (void) { - return lastWrittenLsnCacheSize; -} - /* * neon_get_lwlsn -- Returns maximal LSN of written page. * It returns an upper bound for the last written LSN of a given page, diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 4c3a38f41c76..8cf69efa3781 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -6,15 +6,17 @@ extern int lastWrittenLsnCacheSize; void init_lwlc(void); +void shmeminit(void); +void shmemrequest(void); /* Hooks */ -XLogRecPtr neon_get_lwlsn_hook(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); -void neon_get_lwlsn_v_hook(NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); -XLogRecPtr neon_set_lwlsn_block_range_hook(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); -XLogRecPtr neon_set_lwlsn_block_v_hook(const XLogRecPtr *lsns, NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); -XLogRecPtr neon_set_lwlsn_block_hook(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); -XLogRecPtr neon_set_lwlsn_relation_hook(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum); -XLogRecPtr neon_set_lwlsn_db_hook(XLogRecPtr lsn); +XLogRecPtr neon_get_lwlsn(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); +void neon_get_lwlsn_v(NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns); +XLogRecPtr neon_set_lwlsn_block_range(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks); +XLogRecPtr neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blockno, int nblocks); +XLogRecPtr neon_set_lwlsn_block(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); +XLogRecPtr neon_set_lwlsn_relation(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum); +XLogRecPtr neon_set_lwlsn_db(XLogRecPtr lsn); int GetLastWrittenLSNCacheSize(void); #endif diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index d7f394235c2b..655b68c8d401 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -2231,7 +2231,7 @@ neon_get_request_lsns(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, #if PG_MAJORVERSION_NUM < 17 GetLastWrittenLSNv(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); #else - neon_get_lwlsn_v_hook(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); + neon_get_lwlsn_v(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); #endif for (int i = 0; i < nblocks; i++) From f2a0632cbf2339cbafb91ce47988d006578cb16f Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 4 Mar 2025 15:35:32 -0500 Subject: [PATCH 21/41] removed install_hook macro --- pgxn/neon/neon_lwlc.c | 58 ++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 3f008c65606b..d371242e8383 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -12,18 +12,6 @@ #include "utils/hsearch.h" -#define INSTALL_HOOK(name, function) \ -do { \ - prev_##name = (name); \ - name = &(function); \ -} while (false) - -#define FORWARD_HOOK_CALL(name, ...) \ -do { \ - if (prev_##name) \ - prev_##name(__VA_ARGS__); \ -} while (false) - typedef struct LastWrittenLsnCacheEntry { @@ -99,18 +87,27 @@ init_lwlc(void) lwlc_register_gucs(); - INSTALL_HOOK(shmem_startup_hook, shmeminit); - - INSTALL_HOOK(get_lwlsn_hook, neon_get_lwlsn); - INSTALL_HOOK(get_lwlsn_v_hook, neon_get_lwlsn_v); - INSTALL_HOOK(set_lwlsn_block_range_hook, neon_set_lwlsn_block_range); - INSTALL_HOOK(set_lwlsn_block_v_hook, neon_set_lwlsn_block_v); - INSTALL_HOOK(set_lwlsn_block_hook, neon_set_lwlsn_block); - INSTALL_HOOK(set_lwlsn_relation_hook, neon_set_lwlsn_relation); - INSTALL_HOOK(set_lwlsn_db_hook, neon_set_lwlsn_db); + prev_shmem_startup_hook = shmem_startup_hook; + shmem_startup_hook = shmeminit; + + prev_get_lwlsn_hook = get_lwlsn_hook; + get_lwlsn_hook = neon_get_lwlsn; + prev_get_lwlsn_v_hook = get_lwlsn_v_hook; + get_lwlsn_v_hook = neon_get_lwlsn_v; + prev_set_lwlsn_block_range_hook = set_lwlsn_block_range_hook; + set_lwlsn_block_range_hook = neon_set_lwlsn_block_range; + prev_set_lwlsn_block_v_hook = set_lwlsn_block_v_hook; + set_lwlsn_block_v_hook = neon_set_lwlsn_block_v; + prev_set_lwlsn_block_hook = set_lwlsn_block_hook; + set_lwlsn_block_hook = neon_set_lwlsn_block; + prev_set_lwlsn_relation_hook = set_lwlsn_relation_hook; + set_lwlsn_relation_hook = neon_set_lwlsn_relation; + prev_set_lwlsn_db_hook = set_lwlsn_db_hook; + set_lwlsn_db_hook = neon_set_lwlsn_db; #if PG_VERSION_NUM >= 150000 - INSTALL_HOOK(shmem_request_hook, shmemrequest); + prev_shmem_request_hook = shmem_request_hook; + shmem_request_hook = shmeminit; #else shmemrequest(); #endif @@ -132,16 +129,15 @@ void shmemrequest(void) { } void shmeminit(void) { -if (lastWrittenLsnCacheSize > 0) - { - if (prev_shmem_startup_hook) { - prev_shmem_startup_hook(); - } - static HASHCTL info; - info.keysize = sizeof(BufferTag); - info.entrysize = sizeof(LastWrittenLsnCacheEntry); - lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", + if (lastWrittenLsnCacheSize > 0) + { + if (prev_shmem_startup_hook) { + prev_shmem_startup_hook(); + } + info.keysize = sizeof(BufferTag); + info.entrysize = sizeof(LastWrittenLsnCacheEntry); + lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", lastWrittenLsnCacheSize, lastWrittenLsnCacheSize, &info, HASH_ELEM | HASH_BLOBS); From b382579c77ee75689c53aede81bbed3690147303 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 5 Mar 2025 10:14:58 -0500 Subject: [PATCH 22/41] updated to point to latest postgres changes --- pgxn/neon/neon_lwlc.c | 3 --- vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 6 files changed, 5 insertions(+), 8 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index d371242e8383..e691ddff6379 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -132,9 +132,6 @@ void shmeminit(void) { static HASHCTL info; if (lastWrittenLsnCacheSize > 0) { - if (prev_shmem_startup_hook) { - prev_shmem_startup_hook(); - } info.keysize = sizeof(BufferTag); info.entrysize = sizeof(LastWrittenLsnCacheEntry); lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 6254ab9b4496..b1425505c6f9 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 6254ab9b4496c3e481bc037ae69d859bbc2bdd7d +Subproject commit b1425505c6f9a622a5aadf3ee362740519993310 diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 9b118b1cffa6..533be42f7da9 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 9b118b1cffa6e4ca0d63389b57b54d11e207e9a8 +Subproject commit 533be42f7da97e614ce1c494fafe3e49f53991b1 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 799e7a08dd17..78050f965f2e 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 799e7a08dd171aa06a7395dd326f4243aaeb9f93 +Subproject commit 78050f965f2e550fd6e58f837394cb3d080d7d42 diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 24595554c8c3..ab6693bbfb5a 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 24595554c8c3ec7e0082428d436041d58962ee89 +Subproject commit ab6693bbfb5a0e33283771d8a14a2e055f2a294c diff --git a/vendor/revisions.json b/vendor/revisions.json index dc681c12b9b8..8085ced35627 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "24595554c8c3ec7e0082428d436041d58962ee89" + "ab6693bbfb5a0e33283771d8a14a2e055f2a294c" ], "v16": [ "16.8", From 1ebb93378f226051fae96d5595badac69cce989f Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 5 Mar 2025 10:21:28 -0500 Subject: [PATCH 23/41] pointing to new pg --- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index ab6693bbfb5a..82848f099e8f 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit ab6693bbfb5a0e33283771d8a14a2e055f2a294c +Subproject commit 82848f099e8ff2971ee3df7f1c7f384c323253d3 diff --git a/vendor/revisions.json b/vendor/revisions.json index 8085ced35627..281b7468f5f1 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "ab6693bbfb5a0e33283771d8a14a2e055f2a294c" + "82848f099e8ff2971ee3df7f1c7f384c323253d3" ], "v16": [ "16.8", From 410b6a42d41fd8565ff838f418bb074ccb6850ef Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 5 Mar 2025 10:27:50 -0500 Subject: [PATCH 24/41] fixed issue in pg --- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 82848f099e8f..8de5b9ac12e8 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 82848f099e8ff2971ee3df7f1c7f384c323253d3 +Subproject commit 8de5b9ac12e8a740de9304dd00fa955e624d7cdd diff --git a/vendor/revisions.json b/vendor/revisions.json index 61515378fdfa..fcbc6e789d54 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "82848f099e8ff2971ee3df7f1c7f384c323253d3" + "8de5b9ac12e8a740de9304dd00fa955e624d7cdd" ], "v16": [ "16.8", From 2a60e4c33bed4d6bb6b2999e503baa044862f31a Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 5 Mar 2025 10:54:28 -0500 Subject: [PATCH 25/41] updated pg --- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 8de5b9ac12e8..0e8530fde30c 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 8de5b9ac12e8a740de9304dd00fa955e624d7cdd +Subproject commit 0e8530fde30cce1a145e568438612b2419845e32 diff --git a/vendor/revisions.json b/vendor/revisions.json index fcbc6e789d54..21a97fec13c5 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "8de5b9ac12e8a740de9304dd00fa955e624d7cdd" + "0e8530fde30cce1a145e568438612b2419845e32" ], "v16": [ "16.8", From d6f418edd74d6398a560c2c811f9e172202736be Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 5 Mar 2025 11:48:32 -0500 Subject: [PATCH 26/41] added a struct to ensure objects are in shared memory --- pgxn/neon/neon_lwlc.c | 101 ++++++++++++++++++++++-------------------- pgxn/neon/neon_lwlc.h | 5 --- 2 files changed, 52 insertions(+), 54 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index e691ddff6379..98654b745f8a 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -21,17 +21,20 @@ typedef struct LastWrittenLsnCacheEntry dlist_node lru_node; } LastWrittenLsnCacheEntry; -int lastWrittenLsnCacheSize; -/* - * Maximal last written LSN for pages not present in lastWrittenLsnCache - */ -XLogRecPtr maxLastWrittenLsn; +typedef struct LwLsnCacheCtl { + int lastWrittenLsnCacheSize; + /* + * Maximal last written LSN for pages not present in lastWrittenLsnCache + */ + XLogRecPtr maxLastWrittenLsn; + + /* + * Double linked list to implement LRU replacement policy for last written LSN cache. + * Access to this list as well as to last written LSN cache is protected by 'LastWrittenLsnLock'. + */ + dlist_head lastWrittenLsnLRU; +} LwLsnCacheCtl; -/* - * Double linked list to implement LRU replacement policy for last written LSN cache. - * Access to this list as well as to last written LSN cache is protected by 'LastWrittenLsnLock'. - */ -dlist_head lastWrittenLsnLRU; /* * Cache of last written LSN for each relation page. @@ -43,6 +46,8 @@ dlist_head lastWrittenLsnLRU; */ static HTAB *lastWrittenLsnCache; +LwLsnCacheCtl* LwLsnCache; + static void lwlc_register_gucs(void) @@ -50,7 +55,7 @@ lwlc_register_gucs(void) DefineCustomIntVariable("neon.last_written_lsn_cache_size", "Size of last written LSN cache used by Neon", NULL, - &lastWrittenLsnCacheSize, + &LwLsnCache->lastWrittenLsnCacheSize, (128*1024), 1024, INT_MAX, PGC_POSTMASTER, 0, /* plain units */ @@ -79,6 +84,9 @@ static set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook; static shmem_request_hook_type prev_shmem_request_hook; +static void shmemrequest(void); +static void shmeminit(void); + void init_lwlc(void) { @@ -89,6 +97,8 @@ init_lwlc(void) prev_shmem_startup_hook = shmem_startup_hook; shmem_startup_hook = shmeminit; + prev_shmem_request_hook = shmem_request_hook; + shmem_request_hook = shmemrequest; prev_get_lwlsn_hook = get_lwlsn_hook; get_lwlsn_hook = neon_get_lwlsn; @@ -104,44 +114,37 @@ init_lwlc(void) set_lwlsn_relation_hook = neon_set_lwlsn_relation; prev_set_lwlsn_db_hook = set_lwlsn_db_hook; set_lwlsn_db_hook = neon_set_lwlsn_db; - -#if PG_VERSION_NUM >= 150000 - prev_shmem_request_hook = shmem_request_hook; - shmem_request_hook = shmeminit; -#else - shmemrequest(); -#endif - - // INSTALL_HOOK(xlog_pre_recovery_start_hook, lwlc_pre_recovery_start_hook); } -void shmemrequest(void) { - Size requested_size = sizeof(dlist_head); +static void shmemrequest(void) { + Size requested_size = sizeof(LwLsnCacheCtl); #if PG_VERSION_NUM >= 150000 if (prev_shmem_request_hook) prev_shmem_request_hook(); #endif - requested_size += hash_estimate_size(lastWrittenLsnCacheSize, sizeof(LastWrittenLsnCacheEntry)); + requested_size += hash_estimate_size(LwLsnCache->lastWrittenLsnCacheSize, sizeof(LastWrittenLsnCacheEntry)); RequestAddinShmemSpace(requested_size); } -void shmeminit(void) { +static void shmeminit(void) { static HASHCTL info; - if (lastWrittenLsnCacheSize > 0) + if (LwLsnCache->lastWrittenLsnCacheSize > 0) { + bool found; info.keysize = sizeof(BufferTag); info.entrysize = sizeof(LastWrittenLsnCacheEntry); lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", - lastWrittenLsnCacheSize, lastWrittenLsnCacheSize, + LwLsnCache->lastWrittenLsnCacheSize, LwLsnCache->lastWrittenLsnCacheSize, &info, HASH_ELEM | HASH_BLOBS); + LwLsnCache = ShmemInitStruct("neon/LwLsnCacheCtl", sizeof(LwLsnCacheCtl), &found); } - dlist_init(&lastWrittenLsnLRU); - maxLastWrittenLsn = GetRedoRecPtr(); + dlist_init(&LwLsnCache->lastWrittenLsnLRU); + LwLsnCache->maxLastWrittenLsn = GetRedoRecPtr(); } /* @@ -158,12 +161,12 @@ neon_get_lwlsn(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno) XLogRecPtr lsn; LastWrittenLsnCacheEntry* entry; - Assert(lastWrittenLsnCacheSize != 0); + Assert(LwLsnCache->lastWrittenLsnCacheSize != 0); LWLockAcquire(LastWrittenLsnLock, LW_SHARED); /* Maximal last written LSN among all non-cached pages */ - lsn = maxLastWrittenLsn; + lsn = LwLsnCache->maxLastWrittenLsn; if (rlocator.relNumber != InvalidOid) { @@ -225,7 +228,7 @@ neon_get_lwlsn_v(NRelFileInfo relfilenode, ForkNumber forknum, LastWrittenLsnCacheEntry* entry; XLogRecPtr lsn; - Assert(lastWrittenLsnCacheSize != 0); + Assert(LwLsnCache->lastWrittenLsnCacheSize != 0); Assert(nblocks > 0); Assert(PointerIsValid(lsns)); @@ -268,7 +271,7 @@ neon_get_lwlsn_v(NRelFileInfo relfilenode, ForkNumber forknum, LWLockRelease(LastWrittenLsnLock); LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); - lsn = maxLastWrittenLsn; + lsn = LwLsnCache->maxLastWrittenLsn; for (int i = 0; i < nblocks; i++) { @@ -283,7 +286,7 @@ neon_get_lwlsn_v(NRelFileInfo relfilenode, ForkNumber forknum, else { HASH_SEQ_STATUS seq; - lsn = maxLastWrittenLsn; + lsn = LwLsnCache->maxLastWrittenLsn; /* Find maximum of all cached LSNs */ hash_seq_init(&seq, lastWrittenLsnCache); while ((entry = (LastWrittenLsnCacheEntry *) hash_seq_search(&seq)) != NULL) @@ -311,10 +314,10 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, { if (rlocator.relNumber == InvalidOid) { - if (lsn > maxLastWrittenLsn) - maxLastWrittenLsn = lsn; + if (lsn > LwLsnCache->maxLastWrittenLsn) + LwLsnCache->maxLastWrittenLsn = lsn; else - lsn = maxLastWrittenLsn; + lsn = LwLsnCache->maxLastWrittenLsn; } else { @@ -343,19 +346,19 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, else { entry->lsn = lsn; - if (hash_get_num_entries(lastWrittenLsnCache) > lastWrittenLsnCacheSize) + if (hash_get_num_entries(lastWrittenLsnCache) > LwLsnCache->lastWrittenLsnCacheSize) { /* Replace least recently used entry */ - LastWrittenLsnCacheEntry* victim = dlist_container(LastWrittenLsnCacheEntry, lru_node, dlist_pop_head_node(&lastWrittenLsnLRU)); + LastWrittenLsnCacheEntry* victim = dlist_container(LastWrittenLsnCacheEntry, lru_node, dlist_pop_head_node(&LwLsnCache->lastWrittenLsnLRU)); /* Adjust max LSN for not cached relations/chunks if needed */ - if (victim->lsn > maxLastWrittenLsn) - maxLastWrittenLsn = victim->lsn; + if (victim->lsn > LwLsnCache->maxLastWrittenLsn) + LwLsnCache->maxLastWrittenLsn = victim->lsn; hash_search(lastWrittenLsnCache, victim, HASH_REMOVE, NULL); } } /* Link to the end of LRU list */ - dlist_push_tail(&lastWrittenLsnLRU, &entry->lru_node); + dlist_push_tail(&LwLsnCache->lastWrittenLsnLRU, &entry->lru_node); } } return lsn; @@ -374,7 +377,7 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, XLogRecPtr neon_set_lwlsn_block_range(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks) { - if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0) + if (lsn == InvalidXLogRecPtr || n_blocks == 0 || LwLsnCache->lastWrittenLsnCacheSize == 0) return lsn; LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); @@ -403,7 +406,7 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, bool found; XLogRecPtr max = InvalidXLogRecPtr; - if (lsns == NULL || nblocks == 0 || lastWrittenLsnCacheSize == 0 || + if (lsns == NULL || nblocks == 0 || LwLsnCache->lastWrittenLsnCacheSize == 0 || relfilenode.relNumber == InvalidOid) return InvalidXLogRecPtr; @@ -432,19 +435,19 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, else { entry->lsn = lsn; - if (hash_get_num_entries(lastWrittenLsnCache) > lastWrittenLsnCacheSize) + if (hash_get_num_entries(lastWrittenLsnCache) > LwLsnCache->lastWrittenLsnCacheSize) { /* Replace least recently used entry */ - LastWrittenLsnCacheEntry* victim = dlist_container(LastWrittenLsnCacheEntry, lru_node, dlist_pop_head_node(&lastWrittenLsnLRU)); + LastWrittenLsnCacheEntry* victim = dlist_container(LastWrittenLsnCacheEntry, lru_node, dlist_pop_head_node(&LwLsnCache->lastWrittenLsnLRU)); /* Adjust max LSN for not cached relations/chunks if needed */ - if (victim->lsn > maxLastWrittenLsn) - maxLastWrittenLsn = victim->lsn; + if (victim->lsn > LwLsnCache->maxLastWrittenLsn) + LwLsnCache->maxLastWrittenLsn = victim->lsn; hash_search(lastWrittenLsnCache, victim, HASH_REMOVE, NULL); } } /* Link to the end of LRU list */ - dlist_push_tail(&lastWrittenLsnLRU, &entry->lru_node); + dlist_push_tail(&LwLsnCache->lastWrittenLsnLRU, &entry->lru_node); max = Max(max, lsn); } @@ -481,7 +484,7 @@ neon_set_lwlsn_db(XLogRecPtr lsn) return neon_set_lwlsn_block(lsn, dummyNode, MAIN_FORKNUM, 0); } -#else +#else /* ! PG_MAJORVERSION_NUM == 17 */ void init_lwlc(void) diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 8cf69efa3781..4248c063c1b7 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -3,11 +3,7 @@ #include "neon_pgversioncompat.h" -extern int lastWrittenLsnCacheSize; - void init_lwlc(void); -void shmeminit(void); -void shmemrequest(void); /* Hooks */ XLogRecPtr neon_get_lwlsn(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); @@ -17,6 +13,5 @@ XLogRecPtr neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfileno XLogRecPtr neon_set_lwlsn_block(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno); XLogRecPtr neon_set_lwlsn_relation(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum); XLogRecPtr neon_set_lwlsn_db(XLogRecPtr lsn); -int GetLastWrittenLSNCacheSize(void); #endif From a3c819202e32348d6a4bbbf3180fc0cc9e00b117 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 5 Mar 2025 14:32:35 -0500 Subject: [PATCH 27/41] addressed comments, added check to see if lwlsncachectl was previously initialised --- pgxn/neon/neon_lwlc.c | 11 ++++------- pgxn/neon/neon_lwlc.h | 3 +++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 98654b745f8a..40c249eb3256 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -1,7 +1,6 @@ #include "postgres.h" #include "neon_lwlc.h" - #if PG_MAJORVERSION_NUM >= 17 #include "access/xlog.h" @@ -131,9 +130,9 @@ static void shmemrequest(void) { static void shmeminit(void) { static HASHCTL info; + bool found; if (LwLsnCache->lastWrittenLsnCacheSize > 0) { - bool found; info.keysize = sizeof(BufferTag); info.entrysize = sizeof(LastWrittenLsnCacheEntry); lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", @@ -141,7 +140,9 @@ static void shmeminit(void) { &info, HASH_ELEM | HASH_BLOBS); LwLsnCache = ShmemInitStruct("neon/LwLsnCacheCtl", sizeof(LwLsnCacheCtl), &found); - + if (found) { + return; + } } dlist_init(&LwLsnCache->lastWrittenLsnLRU); LwLsnCache->maxLastWrittenLsn = GetRedoRecPtr(); @@ -486,8 +487,4 @@ neon_set_lwlsn_db(XLogRecPtr lsn) #else /* ! PG_MAJORVERSION_NUM == 17 */ -void -init_lwlc(void) -{} - #endif diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 4248c063c1b7..aa2fd4311754 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,3 +1,5 @@ +#if PG_MAJORVERSION_NUM >= 17 + #ifndef NEON_LWLC_H #define NEON_LWLC_H @@ -15,3 +17,4 @@ XLogRecPtr neon_set_lwlsn_relation(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNu XLogRecPtr neon_set_lwlsn_db(XLogRecPtr lsn); #endif +#endif \ No newline at end of file From bbf07b4e64da4127e18fc2fc1311498d3449eed9 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Thu, 6 Mar 2025 14:17:01 -0500 Subject: [PATCH 28/41] pushing logging code for reference, will remove later --- libs/postgres_ffi/wal_craft/src/lib.rs | 7 +++++++ pgxn/neon/neon_lwlc.c | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libs/postgres_ffi/wal_craft/src/lib.rs b/libs/postgres_ffi/wal_craft/src/lib.rs index ca9530faefdd..5de2c6f8fef3 100644 --- a/libs/postgres_ffi/wal_craft/src/lib.rs +++ b/libs/postgres_ffi/wal_craft/src/lib.rs @@ -122,11 +122,18 @@ impl Conf { let unix_socket_dir_path = unix_socket_dir.path().to_owned(); let server_process = self .new_pg_command("postgres")? + // .args(["-c", "logging_collector=on"]) + // .args(["-c", "log_destination=stderr"]) + // .args(["-c", "log_directory=/Users/suhasthalanki/Documents/neon/logs"]) .args(["-c", "listen_addresses="]) .arg("-k") .arg(&unix_socket_dir_path) .arg("-D") .arg(&self.datadir) + .arg("-d") + .arg("5") + // .arg("-r") + // .arg(Path::new("/Users/suhasthalanki/Documents/neon/test.log")) .args(REQUIRED_POSTGRES_CONFIG.iter().flat_map(|cfg| ["-c", cfg])) .spawn()?; let server = PostgresServer { diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 40c249eb3256..99966606432a 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -51,6 +51,7 @@ LwLsnCacheCtl* LwLsnCache; static void lwlc_register_gucs(void) { + elog(DEBUG3, "Registering lwlc gucs"); DefineCustomIntVariable("neon.last_written_lsn_cache_size", "Size of last written LSN cache used by Neon", NULL, @@ -89,9 +90,13 @@ static void shmeminit(void); void init_lwlc(void) { + elog(DEBUG3, "Started init"); + elog(DEBUG3, "Shared preload librares status: %d", process_shared_preload_libraries_in_progress); if (!process_shared_preload_libraries_in_progress) + elog(DEBUG3, "Shared preload libraries not in progress, exiting"); return; - + + elog(DEBUG3, "Shared preload libraries in progress"); lwlc_register_gucs(); prev_shmem_startup_hook = shmem_startup_hook; @@ -113,6 +118,7 @@ init_lwlc(void) set_lwlsn_relation_hook = neon_set_lwlsn_relation; prev_set_lwlsn_db_hook = set_lwlsn_db_hook; set_lwlsn_db_hook = neon_set_lwlsn_db; + elog(DEBUG3, "Finished installing hooks, leaving init"); } static void shmemrequest(void) { @@ -129,6 +135,7 @@ static void shmemrequest(void) { } static void shmeminit(void) { + elog(DEBUG3, "Started shmeminit"); static HASHCTL info; bool found; if (LwLsnCache->lastWrittenLsnCacheSize > 0) From e5493e9c14f9dd5e7b41d6a1d364818ed92524b3 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Thu, 6 Mar 2025 16:43:15 -0500 Subject: [PATCH 29/41] fixed shmem startup hook that was missing --- pgxn/neon/neon_lwlc.c | 4 +++- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 99966606432a..df58cb64e821 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -135,9 +135,11 @@ static void shmemrequest(void) { } static void shmeminit(void) { - elog(DEBUG3, "Started shmeminit"); static HASHCTL info; bool found; + if (prev_shmem_startup_hook) { + prev_shmem_startup_hook(); + } if (LwLsnCache->lastWrittenLsnCacheSize > 0) { info.keysize = sizeof(BufferTag); diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 0e8530fde30c..d91702739248 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 0e8530fde30cce1a145e568438612b2419845e32 +Subproject commit d9170273924860085eab8097dc381844f2f02fbb diff --git a/vendor/revisions.json b/vendor/revisions.json index 21a97fec13c5..4acd2ce83f63 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "0e8530fde30cce1a145e568438612b2419845e32" + "d9170273924860085eab8097dc381844f2f02fbb" ], "v16": [ "16.8", From 53af8c4d26c83fd2f1ba5886e251741835540eb6 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Fri, 7 Mar 2025 10:35:52 -0500 Subject: [PATCH 30/41] removed log statements --- pgxn/neon/neon_lwlc.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index df58cb64e821..adc2c4ce70f9 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -51,7 +51,6 @@ LwLsnCacheCtl* LwLsnCache; static void lwlc_register_gucs(void) { - elog(DEBUG3, "Registering lwlc gucs"); DefineCustomIntVariable("neon.last_written_lsn_cache_size", "Size of last written LSN cache used by Neon", NULL, @@ -90,13 +89,9 @@ static void shmeminit(void); void init_lwlc(void) { - elog(DEBUG3, "Started init"); - elog(DEBUG3, "Shared preload librares status: %d", process_shared_preload_libraries_in_progress); if (!process_shared_preload_libraries_in_progress) - elog(DEBUG3, "Shared preload libraries not in progress, exiting"); return; - elog(DEBUG3, "Shared preload libraries in progress"); lwlc_register_gucs(); prev_shmem_startup_hook = shmem_startup_hook; @@ -118,7 +113,6 @@ init_lwlc(void) set_lwlsn_relation_hook = neon_set_lwlsn_relation; prev_set_lwlsn_db_hook = set_lwlsn_db_hook; set_lwlsn_db_hook = neon_set_lwlsn_db; - elog(DEBUG3, "Finished installing hooks, leaving init"); } static void shmemrequest(void) { From cba316775e1a5bfe84ce19ca4da248e636af8e8d Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 10 Mar 2025 12:19:30 -0400 Subject: [PATCH 31/41] fixed issue with utilising uninitalised lwlsn cache size variable of struct --- libs/postgres_ffi/wal_craft/src/lib.rs | 7 ------- pgxn/neon/neon_lwlc.c | 12 ++++++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libs/postgres_ffi/wal_craft/src/lib.rs b/libs/postgres_ffi/wal_craft/src/lib.rs index 5de2c6f8fef3..ca9530faefdd 100644 --- a/libs/postgres_ffi/wal_craft/src/lib.rs +++ b/libs/postgres_ffi/wal_craft/src/lib.rs @@ -122,18 +122,11 @@ impl Conf { let unix_socket_dir_path = unix_socket_dir.path().to_owned(); let server_process = self .new_pg_command("postgres")? - // .args(["-c", "logging_collector=on"]) - // .args(["-c", "log_destination=stderr"]) - // .args(["-c", "log_directory=/Users/suhasthalanki/Documents/neon/logs"]) .args(["-c", "listen_addresses="]) .arg("-k") .arg(&unix_socket_dir_path) .arg("-D") .arg(&self.datadir) - .arg("-d") - .arg("5") - // .arg("-r") - // .arg(Path::new("/Users/suhasthalanki/Documents/neon/test.log")) .args(REQUIRED_POSTGRES_CONFIG.iter().flat_map(|cfg| ["-c", cfg])) .spawn()?; let server = PostgresServer { diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index adc2c4ce70f9..9a645828241e 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -47,6 +47,8 @@ static HTAB *lastWrittenLsnCache; LwLsnCacheCtl* LwLsnCache; +static int lwlsn_cache_size; + static void lwlc_register_gucs(void) @@ -54,7 +56,7 @@ lwlc_register_gucs(void) DefineCustomIntVariable("neon.last_written_lsn_cache_size", "Size of last written LSN cache used by Neon", NULL, - &LwLsnCache->lastWrittenLsnCacheSize, + &lwlsn_cache_size, (128*1024), 1024, INT_MAX, PGC_POSTMASTER, 0, /* plain units */ @@ -123,7 +125,7 @@ static void shmemrequest(void) { prev_shmem_request_hook(); #endif - requested_size += hash_estimate_size(LwLsnCache->lastWrittenLsnCacheSize, sizeof(LastWrittenLsnCacheEntry)); + requested_size += hash_estimate_size(lwlsn_cache_size, sizeof(LastWrittenLsnCacheEntry)); RequestAddinShmemSpace(requested_size); } @@ -134,15 +136,17 @@ static void shmeminit(void) { if (prev_shmem_startup_hook) { prev_shmem_startup_hook(); } - if (LwLsnCache->lastWrittenLsnCacheSize > 0) + if (lwlsn_cache_size > 0) { info.keysize = sizeof(BufferTag); info.entrysize = sizeof(LastWrittenLsnCacheEntry); lastWrittenLsnCache = ShmemInitHash("last_written_lsn_cache", - LwLsnCache->lastWrittenLsnCacheSize, LwLsnCache->lastWrittenLsnCacheSize, + lwlsn_cache_size, lwlsn_cache_size, &info, HASH_ELEM | HASH_BLOBS); LwLsnCache = ShmemInitStruct("neon/LwLsnCacheCtl", sizeof(LwLsnCacheCtl), &found); + // Now set the size in the struct + LwLsnCache->lastWrittenLsnCacheSize = lwlsn_cache_size; if (found) { return; } From 31115b68a36f418ceb14f5c873e8d5d3de69347e Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 10 Mar 2025 12:31:21 -0400 Subject: [PATCH 32/41] updated pg17 to resolve ci --- vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index b1425505c6f9..7b7592e74059 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit b1425505c6f9a622a5aadf3ee362740519993310 +Subproject commit 7b7592e74059f795b64f06860cea97673418f35e diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 533be42f7da9..ee794ba767ee 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 533be42f7da97e614ce1c494fafe3e49f53991b1 +Subproject commit ee794ba767eef9b10260ef67d3a58084f1dabd6f diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 78050f965f2e..512856aaa8be 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 78050f965f2e550fd6e58f837394cb3d080d7d42 +Subproject commit 512856aaa8bedbaa8f06811449518dcb0c2e5d8f diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index d91702739248..ec9a4cfdbd8a 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit d9170273924860085eab8097dc381844f2f02fbb +Subproject commit ec9a4cfdbd8a101b6274c7dd5f931071a41f9077 From 25a01d6866d79cc129a5b3abb02bc9d663ec8286 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 10 Mar 2025 12:32:29 -0400 Subject: [PATCH 33/41] pointing to merged pg 17 --- vendor/revisions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index 4acd2ce83f63..f0f23386c4f2 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "d9170273924860085eab8097dc381844f2f02fbb" + "ec9a4cfdbd8a101b6274c7dd5f931071a41f9077" ], "v16": [ "16.8", From 3f5e6a6a02a5cdc1af52c685146251fc68f93713 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 10 Mar 2025 13:11:27 -0400 Subject: [PATCH 34/41] updated revisions.json --- vendor/revisions.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vendor/revisions.json b/vendor/revisions.json index 0c267f772f66..bcce912f19da 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,11 +1,7 @@ { "v17": [ "17.4", -<<<<<<< HEAD "ec9a4cfdbd8a101b6274c7dd5f931071a41f9077" -======= - "e5e87b9f52d0eaeb83f3e2517bb9727aac37729b" ->>>>>>> main ], "v16": [ "16.8", From 814ed1c7dad9673bd20b76f2099b4d7e3037a5d2 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 10 Mar 2025 20:21:16 -0400 Subject: [PATCH 35/41] moved lwlsn cache to neon ext for pg15 and pg16 --- .gitmodules | 4 +-- pgxn/neon/file_cache.c | 4 +-- pgxn/neon/neon.c | 5 ++-- pgxn/neon/neon_lwlc.c | 49 ++++++++++++++++---------------- pgxn/neon/neon_lwlc.h | 2 +- pgxn/neon/neon_pgversioncompat.h | 17 +++++++++++ pgxn/neon/pagestore_smgr.c | 6 +++- pgxn/neon_walredo/walredoproc.c | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/revisions.json | 4 +-- 11 files changed, 60 insertions(+), 37 deletions(-) diff --git a/.gitmodules b/.gitmodules index cc5a79847715..d2e3b21af85c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,11 +5,11 @@ [submodule "vendor/postgres-v15"] path = vendor/postgres-v15 url = https://github.com/neondatabase/postgres.git - branch = REL_15_STABLE_neon + branch = thesuhas/move_lwlsn_neon_ext_v15 [submodule "vendor/postgres-v16"] path = vendor/postgres-v16 url = https://github.com/neondatabase/postgres.git - branch = REL_16_STABLE_neon + branch = thesuhas/move_lwlsn_neon_ext_v16 [submodule "vendor/postgres-v17"] path = vendor/postgres-v17 url = https://github.com/neondatabase/postgres.git diff --git a/pgxn/neon/file_cache.c b/pgxn/neon/file_cache.c index 3cf89b6efcda..f6d341ed43db 100644 --- a/pgxn/neon/file_cache.c +++ b/pgxn/neon/file_cache.c @@ -50,7 +50,7 @@ #include "neon.h" #include "neon_perf_counters.h" -#if PG_VERSION_NUM >= 170000 +#if PG_VERSION_NUM >= 150000 #include "neon_lwlc.h" #endif @@ -1003,7 +1003,7 @@ lfc_prefetch(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, LWLockRelease(lfc_lock); return false; } - #if PG_VERSION_NUM >= 170000 + #if PG_VERSION_NUM >= 150000 lwlsn = neon_get_lwlsn(rinfo, forknum, blkno); #else lwlsn = GetLastWrittenLSN(rinfo, forknum, blkno); diff --git a/pgxn/neon/neon.c b/pgxn/neon/neon.c index 1429d26a0434..ccd921a0d067 100644 --- a/pgxn/neon/neon.c +++ b/pgxn/neon/neon.c @@ -40,7 +40,8 @@ #if PG_MAJORVERSION_NUM >= 16 #include "storage/ipc.h" #endif -#if PG_MAJORVERSION_NUM >= 17 + +#if PG_MAJORVERSION_NUM >= 15 #include "neon_lwlc.h" #endif @@ -440,7 +441,7 @@ _PG_init(void) pg_init_libpagestore(); pg_init_walproposer(); -#if PG_VERSION_NUM >= 170000 +#if PG_MAJORVERSION_NUM >= 15 init_lwlc(); #endif pagestore_smgr_init(); diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 9a645828241e..b816fe305bd3 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -1,8 +1,9 @@ #include "postgres.h" #include "neon_lwlc.h" -#if PG_MAJORVERSION_NUM >= 17 +#if PG_MAJORVERSION_NUM >= 15 +#include "miscadmin.h" #include "access/xlog.h" #include "storage/ipc.h" #include "storage/shmem.h" @@ -47,7 +48,7 @@ static HTAB *lastWrittenLsnCache; LwLsnCacheCtl* LwLsnCache; -static int lwlsn_cache_size; +static int lwlsn_cache_size = (128 * 1024); static void @@ -176,14 +177,14 @@ neon_get_lwlsn(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno) /* Maximal last written LSN among all non-cached pages */ lsn = LwLsnCache->maxLastWrittenLsn; - if (rlocator.relNumber != InvalidOid) + if (NInfoGetRelNumber(rlocator) != InvalidOid) { BufferTag key; - key.spcOid = rlocator.spcOid; - key.dbOid = rlocator.dbOid; - key.relNumber = rlocator.relNumber; - key.forkNum = forknum; - key.blockNum = blkno; + Oid spcOid = NInfoGetSpcOid(rlocator); + Oid dbOid = NInfoGetDbOid(rlocator); + Oid relNumber = NInfoGetRelNumber(rlocator); + BufTagInit(key, relNumber, forknum, blkno, spcOid, dbOid); + entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL); if (entry != NULL) lsn = entry->lsn; @@ -242,15 +243,14 @@ neon_get_lwlsn_v(NRelFileInfo relfilenode, ForkNumber forknum, LWLockAcquire(LastWrittenLsnLock, LW_SHARED); - if (relfilenode.relNumber != InvalidOid) + if (NInfoGetRelNumber(relfilenode) != InvalidOid) { BufferTag key; bool missed_keys = false; - - key.spcOid = relfilenode.spcOid; - key.dbOid = relfilenode.dbOid; - key.relNumber = relfilenode.relNumber; - key.forkNum = forknum; + Oid spcOid = NInfoGetSpcOid(relfilenode); + Oid dbOid = NInfoGetDbOid(relfilenode); + Oid relNumber = NInfoGetRelNumber(relfilenode); + BufTagInit(key, relNumber, forknum, blkno, spcOid, dbOid); for (int i = 0; i < nblocks; i++) { @@ -320,7 +320,7 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, BlockNumber from, BlockNumber n_blocks) { - if (rlocator.relNumber == InvalidOid) + if (NInfoGetRelNumber(rlocator) == InvalidOid) { if (lsn > LwLsnCache->maxLastWrittenLsn) LwLsnCache->maxLastWrittenLsn = lsn; @@ -334,10 +334,10 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, bool found; BlockNumber i; - key.spcOid = rlocator.spcOid; - key.dbOid = rlocator.dbOid; - key.relNumber = rlocator.relNumber; - key.forkNum = forknum; + Oid spcOid = NInfoGetSpcOid(rlocator); + Oid dbOid = NInfoGetDbOid(rlocator); + Oid relNumber = NInfoGetRelNumber(rlocator); + BufTagInit(key, relNumber, forknum, from, spcOid, dbOid); for (i = 0; i < n_blocks; i++) { key.blockNum = from + i; @@ -413,15 +413,16 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, BufferTag key; bool found; XLogRecPtr max = InvalidXLogRecPtr; + Oid spcOid = NInfoGetSpcOid(relfilenode); + Oid dbOid = NInfoGetDbOid(relfilenode); + Oid relNumber = NInfoGetRelNumber(relfilenode); if (lsns == NULL || nblocks == 0 || LwLsnCache->lastWrittenLsnCacheSize == 0 || - relfilenode.relNumber == InvalidOid) + NInfoGetRelNumber(relfilenode) == InvalidOid) return InvalidXLogRecPtr; - key.relNumber = relfilenode.relNumber; - key.dbOid = relfilenode.dbOid; - key.spcOid = relfilenode.spcOid; - key.forkNum = forknum; + + BufTagInit(key, relNumber, forknum, blockno, spcOid, dbOid); LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE); diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index aa2fd4311754..035dc50b9ab1 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,4 +1,4 @@ -#if PG_MAJORVERSION_NUM >= 17 +#if PG_MAJORVERSION_NUM >= 15 #ifndef NEON_LWLC_H #define NEON_LWLC_H diff --git a/pgxn/neon/neon_pgversioncompat.h b/pgxn/neon/neon_pgversioncompat.h index 6b4b355672a8..cdfb0c0b1221 100644 --- a/pgxn/neon/neon_pgversioncompat.h +++ b/pgxn/neon/neon_pgversioncompat.h @@ -76,6 +76,14 @@ InitBufferTag(BufferTag *tag, const RelFileNode *rnode, #define BufTagGetRelNumber(tagp) ((tagp)->rnode.relNode) +#define BufTagInit(tag, relNumber, forknum, blkno, spcOid, dbOid) \ + do { \ + RelFileNode rnode = { .spcNode = spcOid, .dbNode = dbOid, .relNode = relNumber}; \ + (tag).forkNum = forknum; \ + (tag).blockNum = blkno; \ + (tag).rnode = rnode; \ + } while (false) + #define InvalidRelFileNumber InvalidOid #define SMgrRelGetRelInfo(reln) \ @@ -125,6 +133,15 @@ InitBufferTag(BufferTag *tag, const RelFileNode *rnode, .relNumber = (tag).relNumber, \ }) + #define BufTagInit(tag, relNumber, forknum, blkno, spcOid, dbOid) \ + do { \ + (tag).forkNum = forknum; \ + (tag).blockNum = blkno; \ + (tag).spcOid = spcOid; \ + (tag).dbOid = dbOid; \ + (tag).relNumber = relNumber; \ + } while (false) + #define SMgrRelGetRelInfo(reln) \ ((reln)->smgr_rlocator) diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index 7f8b143fc6a3..b3ef14d4f06a 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -76,7 +76,7 @@ #include "access/xlogrecovery.h" #endif -#if PG_VERSION_NUM >= 170000 +#if PG_VERSION_NUM >= 150000 #include "neon_lwlc.h" #endif @@ -2226,7 +2226,11 @@ static void GetLastWrittenLSNv(NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns) { + #if PG_MAJORVERSION_NUM < 15 lsns[0] = GetLastWrittenLSN(relfilenode, forknum, blkno); + #else + lsns[0] = neon_get_lwlsn(relfilenode, forknum, blkno); + #endif } #endif diff --git a/pgxn/neon_walredo/walredoproc.c b/pgxn/neon_walredo/walredoproc.c index 29b54f537137..240f8ab19d91 100644 --- a/pgxn/neon_walredo/walredoproc.c +++ b/pgxn/neon_walredo/walredoproc.c @@ -286,7 +286,7 @@ WalRedoMain(int argc, char *argv[]) max_wal_senders = 0; InitializeMaxBackends(); - #if PG_VERSION_NUM < 170000 + #if PG_VERSION_NUM < 150000 /* Disable lastWrittenLsnCache */ lastWrittenLsnCacheSize = 0; #endif diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index ee794ba767ee..616a9c1e53fa 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit ee794ba767eef9b10260ef67d3a58084f1dabd6f +Subproject commit 616a9c1e53faf3ba59e1a5e4fccfc3e9329b6ad3 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 512856aaa8be..721dc7993107 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 512856aaa8bedbaa8f06811449518dcb0c2e5d8f +Subproject commit 721dc7993107af7940a183e831c59d0fe72b51fe diff --git a/vendor/revisions.json b/vendor/revisions.json index bcce912f19da..52458f797637 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -5,11 +5,11 @@ ], "v16": [ "16.8", - "512856aaa8bedbaa8f06811449518dcb0c2e5d8f" + "50adfabb8e201ac0f45496cf79ac0d3a50f7e308" ], "v15": [ "15.12", - "ee794ba767eef9b10260ef67d3a58084f1dabd6f" + "616a9c1e53faf3ba59e1a5e4fccfc3e9329b6ad3" ], "v14": [ "14.17", From 52a03b1698be1d1687d8f6bee93e6252cd0b3a77 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Mon, 10 Mar 2025 20:25:33 -0400 Subject: [PATCH 36/41] updated pg17 --- vendor/postgres-v17 | 2 +- vendor/revisions.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index ec9a4cfdbd8a..c28913db6b94 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit ec9a4cfdbd8a101b6274c7dd5f931071a41f9077 +Subproject commit c28913db6b94f2e73fb8fcce44a283bebb7ae5ef diff --git a/vendor/revisions.json b/vendor/revisions.json index 52458f797637..649e3ae958db 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,7 +1,7 @@ { "v17": [ "17.4", - "ec9a4cfdbd8a101b6274c7dd5f931071a41f9077" + "c28913db6b94f2e73fb8fcce44a283bebb7ae5ef" ], "v16": [ "16.8", From a9df95d4522f370fb314190e7ba0981a643ce64b Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 11 Mar 2025 11:37:11 -0400 Subject: [PATCH 37/41] added pg14 compatibility --- .gitmodules | 2 +- pgxn/neon/file_cache.c | 10 ++-------- pgxn/neon/neon.c | 8 ++------ pgxn/neon/neon_lwlc.c | 21 +++++++++++---------- pgxn/neon/neon_lwlc.h | 3 --- pgxn/neon/pagestore_smgr.c | 8 +------- pgxn/neon_walredo/walredoproc.c | 5 ----- vendor/postgres-v14 | 2 +- vendor/revisions.json | 2 +- 9 files changed, 19 insertions(+), 42 deletions(-) diff --git a/.gitmodules b/.gitmodules index d2e3b21af85c..7cffd15daaea 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "vendor/postgres-v14"] path = vendor/postgres-v14 url = https://github.com/neondatabase/postgres.git - branch = REL_14_STABLE_neon + branch = thesuhas/move_lwlsn_neon_ext_v14 [submodule "vendor/postgres-v15"] path = vendor/postgres-v15 url = https://github.com/neondatabase/postgres.git diff --git a/pgxn/neon/file_cache.c b/pgxn/neon/file_cache.c index f6d341ed43db..ef56ed088fd8 100644 --- a/pgxn/neon/file_cache.c +++ b/pgxn/neon/file_cache.c @@ -48,11 +48,8 @@ #include "hll.h" #include "bitmap.h" #include "neon.h" -#include "neon_perf_counters.h" - -#if PG_VERSION_NUM >= 150000 #include "neon_lwlc.h" -#endif +#include "neon_perf_counters.h" #define CriticalAssert(cond) do if (!(cond)) elog(PANIC, "LFC: assertion %s failed at %s:%d: ", #cond, __FILE__, __LINE__); while (0) @@ -1003,11 +1000,8 @@ lfc_prefetch(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, LWLockRelease(lfc_lock); return false; } - #if PG_VERSION_NUM >= 150000 + lwlsn = neon_get_lwlsn(rinfo, forknum, blkno); - #else - lwlsn = GetLastWrittenLSN(rinfo, forknum, blkno); - #endif if (lwlsn > lsn) { diff --git a/pgxn/neon/neon.c b/pgxn/neon/neon.c index ccd921a0d067..b203f288d228 100644 --- a/pgxn/neon/neon.c +++ b/pgxn/neon/neon.c @@ -33,6 +33,7 @@ #include "extension_server.h" #include "neon.h" +#include "neon_lwlc.h" #include "control_plane_connector.h" #include "logical_replication_monitor.h" #include "unstable_extensions.h" @@ -41,10 +42,6 @@ #include "storage/ipc.h" #endif -#if PG_MAJORVERSION_NUM >= 15 -#include "neon_lwlc.h" -#endif - PG_MODULE_MAGIC; void _PG_init(void); @@ -441,9 +438,8 @@ _PG_init(void) pg_init_libpagestore(); pg_init_walproposer(); -#if PG_MAJORVERSION_NUM >= 15 init_lwlc(); -#endif + pagestore_smgr_init(); Custom_XLogReaderRoutines = NeonOnDemandXLogReaderRoutines; diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index b816fe305bd3..731ea800e8c4 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -1,7 +1,6 @@ #include "postgres.h" #include "neon_lwlc.h" -#if PG_MAJORVERSION_NUM >= 15 #include "miscadmin.h" #include "access/xlog.h" @@ -84,9 +83,12 @@ static set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; static set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook; -static shmem_request_hook_type prev_shmem_request_hook; +#if PG_VERSION_NUM >= 150000 +static shmem_request_hook_type prev_shmem_request_hook; static void shmemrequest(void); +#endif + static void shmeminit(void); void @@ -99,8 +101,11 @@ init_lwlc(void) prev_shmem_startup_hook = shmem_startup_hook; shmem_startup_hook = shmeminit; + + #if PG_VERSION_NUM >= 150000 prev_shmem_request_hook = shmem_request_hook; shmem_request_hook = shmemrequest; + #endif prev_get_lwlsn_hook = get_lwlsn_hook; get_lwlsn_hook = neon_get_lwlsn; @@ -118,18 +123,18 @@ init_lwlc(void) set_lwlsn_db_hook = neon_set_lwlsn_db; } +#if PG_VERSION_NUM >= 150000 static void shmemrequest(void) { Size requested_size = sizeof(LwLsnCacheCtl); - #if PG_VERSION_NUM >= 150000 - if (prev_shmem_request_hook) + if (prev_shmem_request_hook) prev_shmem_request_hook(); - #endif requested_size += hash_estimate_size(lwlsn_cache_size, sizeof(LastWrittenLsnCacheEntry)); RequestAddinShmemSpace(requested_size); } +#endif static void shmeminit(void) { static HASHCTL info; @@ -491,8 +496,4 @@ neon_set_lwlsn_db(XLogRecPtr lsn) { NRelFileInfo dummyNode = {InvalidOid, InvalidOid, InvalidOid}; return neon_set_lwlsn_block(lsn, dummyNode, MAIN_FORKNUM, 0); -} - -#else /* ! PG_MAJORVERSION_NUM == 17 */ - -#endif +} \ No newline at end of file diff --git a/pgxn/neon/neon_lwlc.h b/pgxn/neon/neon_lwlc.h index 035dc50b9ab1..041d824b1578 100644 --- a/pgxn/neon/neon_lwlc.h +++ b/pgxn/neon/neon_lwlc.h @@ -1,5 +1,3 @@ -#if PG_MAJORVERSION_NUM >= 15 - #ifndef NEON_LWLC_H #define NEON_LWLC_H @@ -16,5 +14,4 @@ XLogRecPtr neon_set_lwlsn_block(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumbe XLogRecPtr neon_set_lwlsn_relation(XLogRecPtr lsn, NRelFileInfo rlocator, ForkNumber forknum); XLogRecPtr neon_set_lwlsn_db(XLogRecPtr lsn); -#endif #endif \ No newline at end of file diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index b3ef14d4f06a..4d38a179fb05 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -69,6 +69,7 @@ #include "bitmap.h" #include "neon.h" +#include "neon_lwlc.h" #include "neon_perf_counters.h" #include "pagestore_client.h" @@ -76,9 +77,6 @@ #include "access/xlogrecovery.h" #endif -#if PG_VERSION_NUM >= 150000 -#include "neon_lwlc.h" -#endif /* * If DEBUG_COMPARE_LOCAL is defined, we pass through all the SMGR API @@ -2226,11 +2224,7 @@ static void GetLastWrittenLSNv(NRelFileInfo relfilenode, ForkNumber forknum, BlockNumber blkno, int nblocks, XLogRecPtr *lsns) { - #if PG_MAJORVERSION_NUM < 15 - lsns[0] = GetLastWrittenLSN(relfilenode, forknum, blkno); - #else lsns[0] = neon_get_lwlsn(relfilenode, forknum, blkno); - #endif } #endif diff --git a/pgxn/neon_walredo/walredoproc.c b/pgxn/neon_walredo/walredoproc.c index 240f8ab19d91..a1be49857318 100644 --- a/pgxn/neon_walredo/walredoproc.c +++ b/pgxn/neon_walredo/walredoproc.c @@ -286,11 +286,6 @@ WalRedoMain(int argc, char *argv[]) max_wal_senders = 0; InitializeMaxBackends(); - #if PG_VERSION_NUM < 150000 - /* Disable lastWrittenLsnCache */ - lastWrittenLsnCacheSize = 0; - #endif - #if PG_VERSION_NUM >= 150000 process_shmem_requests(); InitializeShmemGUCs(); diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 7b7592e74059..7168d0f1f80f 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 7b7592e74059f795b64f06860cea97673418f35e +Subproject commit 7168d0f1f80f67bdc17b247e99286131cc04126c diff --git a/vendor/revisions.json b/vendor/revisions.json index 649e3ae958db..d1fadaa23ab1 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -13,6 +13,6 @@ ], "v14": [ "14.17", - "7b7592e74059f795b64f06860cea97673418f35e" + "7168d0f1f80f67bdc17b247e99286131cc04126c" ] } From 89d61a58f2514c5aeb54e6eb4a3c143a3924593a Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 11 Mar 2025 12:43:45 -0400 Subject: [PATCH 38/41] moved shmemrequest to init() for pgv14 --- pgxn/neon/neon_lwlc.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 731ea800e8c4..6f6cff83a067 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -86,9 +86,9 @@ static shmem_startup_hook_type prev_shmem_startup_hook; #if PG_VERSION_NUM >= 150000 static shmem_request_hook_type prev_shmem_request_hook; -static void shmemrequest(void); #endif +static void shmemrequest(void); static void shmeminit(void); void @@ -105,6 +105,8 @@ init_lwlc(void) #if PG_VERSION_NUM >= 150000 prev_shmem_request_hook = shmem_request_hook; shmem_request_hook = shmemrequest; + #else + shmemrequest(); #endif prev_get_lwlsn_hook = get_lwlsn_hook; @@ -123,18 +125,19 @@ init_lwlc(void) set_lwlsn_db_hook = neon_set_lwlsn_db; } -#if PG_VERSION_NUM >= 150000 + static void shmemrequest(void) { Size requested_size = sizeof(LwLsnCacheCtl); + #if PG_VERSION_NUM >= 150000 if (prev_shmem_request_hook) prev_shmem_request_hook(); + #endif + + requested_size += hash_estimate_size(lwlsn_cache_size, sizeof(LastWrittenLsnCacheEntry)); - requested_size += hash_estimate_size(lwlsn_cache_size, sizeof(LastWrittenLsnCacheEntry)); - - RequestAddinShmemSpace(requested_size); + RequestAddinShmemSpace(requested_size); } -#endif static void shmeminit(void) { static HASHCTL info; From 382026851ff83f924bad030d74d2d9afeab88b18 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Tue, 11 Mar 2025 15:46:31 -0400 Subject: [PATCH 39/41] updated revisions.json, removed unnecessary lwlsn func in pagestore smgr --- pgxn/neon/pagestore_smgr.c | 22 ---------------------- vendor/revisions.json | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index 4d38a179fb05..adcfcc3c332d 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -338,11 +338,6 @@ static void prefetch_do_request(PrefetchRequest *slot, neon_request_lsns *force_ static bool prefetch_wait_for(uint64 ring_index); static void prefetch_cleanup_trailing_unused(void); static inline void prefetch_set_unused(uint64 ring_index); -#if PG_MAJORVERSION_NUM < 17 -static void -GetLastWrittenLSNv(NRelFileInfo relfilenode, ForkNumber forknum, - BlockNumber blkno, int nblocks, XLogRecPtr *lsns); -#endif static void neon_get_request_lsns(NRelFileInfo rinfo, ForkNumber forknum, @@ -2215,19 +2210,6 @@ nm_adjust_lsn(XLogRecPtr lsn) } -/* - * Since PG17 we use vetorized version, - * so add compatibility function for older versions - */ -#if PG_MAJORVERSION_NUM < 17 -static void -GetLastWrittenLSNv(NRelFileInfo relfilenode, ForkNumber forknum, - BlockNumber blkno, int nblocks, XLogRecPtr *lsns) -{ - lsns[0] = neon_get_lwlsn(relfilenode, forknum, blkno); -} -#endif - /* * Return LSN for requesting pages and number of blocks from page server */ @@ -2239,11 +2221,7 @@ neon_get_request_lsns(NRelFileInfo rinfo, ForkNumber forknum, BlockNumber blkno, Assert(nblocks <= PG_IOV_MAX); - #if PG_MAJORVERSION_NUM < 17 - GetLastWrittenLSNv(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); - #else neon_get_lwlsn_v(rinfo, forknum, blkno, (int) nblocks, last_written_lsns); - #endif for (int i = 0; i < nblocks; i++) { diff --git a/vendor/revisions.json b/vendor/revisions.json index d1fadaa23ab1..7f66f880dee0 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -5,7 +5,7 @@ ], "v16": [ "16.8", - "50adfabb8e201ac0f45496cf79ac0d3a50f7e308" + "721dc7993107af7940a183e831c59d0fe72b51fe" ], "v15": [ "15.12", From c3a5370477ec78efbb690e164382c25bf0c02adb Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 12 Mar 2025 11:45:23 -0400 Subject: [PATCH 40/41] fixed maxlastwrittenlsn not updating --- pgxn/neon/neon_lwlc.c | 8 ++++++++ vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 8 ++++---- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index 6f6cff83a067..d969ffb720ef 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -81,6 +81,7 @@ static set_lwlsn_block_v_hook_type prev_set_lwlsn_block_v_hook = NULL; static set_lwlsn_block_hook_type prev_set_lwlsn_block_hook = NULL; static set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; static set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; +static update_max_lwlsn_hook_type prev_update_max_lwlsn_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook; @@ -90,6 +91,7 @@ static shmem_request_hook_type prev_shmem_request_hook; static void shmemrequest(void); static void shmeminit(void); +static void neon_update_max_lwlsn(XLogRecPtr lsn); void init_lwlc(void) @@ -123,6 +125,8 @@ init_lwlc(void) set_lwlsn_relation_hook = neon_set_lwlsn_relation; prev_set_lwlsn_db_hook = set_lwlsn_db_hook; set_lwlsn_db_hook = neon_set_lwlsn_db; + prev_update_max_lwlsn_hook = update_max_lwlsn_hook; + update_max_lwlsn_hook = neon_update_max_lwlsn; } @@ -230,6 +234,10 @@ neon_get_lwlsn(NRelFileInfo rlocator, ForkNumber forknum, BlockNumber blkno) return lsn; } +static void neon_update_max_lwlsn(XLogRecPtr lsn) { + LwLsnCache->maxLastWrittenLsn = lsn; +} + /* * GetLastWrittenLSN -- Returns maximal LSN of written page. * It returns an upper bound for the last written LSN of a given page, diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 7168d0f1f80f..488bd46bb578 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 7168d0f1f80f67bdc17b247e99286131cc04126c +Subproject commit 488bd46bb578e0b386c9d0acb1f8f484d87849e0 diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 616a9c1e53fa..409da40fe97a 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 616a9c1e53faf3ba59e1a5e4fccfc3e9329b6ad3 +Subproject commit 409da40fe97a62853fcc59132e2481d0680aa5ec diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 721dc7993107..382d4a827ac5 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 721dc7993107af7940a183e831c59d0fe72b51fe +Subproject commit 382d4a827ac5e0c206b70efb6accd0dd104a4eab diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index c28913db6b94..cf73c345ff45 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit c28913db6b94f2e73fb8fcce44a283bebb7ae5ef +Subproject commit cf73c345ff452b5f2deb50d198514616fddbd8ba diff --git a/vendor/revisions.json b/vendor/revisions.json index 7f66f880dee0..1072b479f882 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,18 +1,18 @@ { "v17": [ "17.4", - "c28913db6b94f2e73fb8fcce44a283bebb7ae5ef" + "cf73c345ff452b5f2deb50d198514616fddbd8ba" ], "v16": [ "16.8", - "721dc7993107af7940a183e831c59d0fe72b51fe" + "382d4a827ac5e0c206b70efb6accd0dd104a4eab" ], "v15": [ "15.12", - "616a9c1e53faf3ba59e1a5e4fccfc3e9329b6ad3" + "409da40fe97a62853fcc59132e2481d0680aa5ec" ], "v14": [ "14.17", - "7168d0f1f80f67bdc17b247e99286131cc04126c" + "488bd46bb578e0b386c9d0acb1f8f484d87849e0" ] } From 6df3fc19ec669bcfbbf9aba41d1338898d24eaa0 Mon Sep 17 00:00:00 2001 From: Suhas Thalanki Date: Wed, 12 Mar 2025 13:29:54 -0400 Subject: [PATCH 41/41] cleaned up code, removed unnecessary hooks --- pgxn/neon/neon_lwlc.c | 15 +-------------- vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 8 ++++---- 6 files changed, 9 insertions(+), 22 deletions(-) diff --git a/pgxn/neon/neon_lwlc.c b/pgxn/neon/neon_lwlc.c index d969ffb720ef..16fc78c8b89c 100644 --- a/pgxn/neon/neon_lwlc.c +++ b/pgxn/neon/neon_lwlc.c @@ -70,17 +70,12 @@ static XLogRecPtr SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, BlockNumber n_blocks); /* All the necessary hooks are defined here */ - // TODO: Need to see how to define this -void lwlc_pre_recovery_start_hook(const ControlFileData* controlFile); + // Note: these are the previous hooks -static get_lwlsn_hook_type prev_get_lwlsn_hook = NULL; -static get_lwlsn_v_hook_type prev_get_lwlsn_v_hook = NULL; static set_lwlsn_block_range_hook_type prev_set_lwlsn_block_range_hook = NULL; static set_lwlsn_block_v_hook_type prev_set_lwlsn_block_v_hook = NULL; static set_lwlsn_block_hook_type prev_set_lwlsn_block_hook = NULL; -static set_lwlsn_relation_hook_type prev_set_lwlsn_relation_hook = NULL; -static set_lwlsn_db_hook_type prev_set_lwlsn_db_hook = NULL; static update_max_lwlsn_hook_type prev_update_max_lwlsn_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook; @@ -111,20 +106,12 @@ init_lwlc(void) shmemrequest(); #endif - prev_get_lwlsn_hook = get_lwlsn_hook; - get_lwlsn_hook = neon_get_lwlsn; - prev_get_lwlsn_v_hook = get_lwlsn_v_hook; - get_lwlsn_v_hook = neon_get_lwlsn_v; prev_set_lwlsn_block_range_hook = set_lwlsn_block_range_hook; set_lwlsn_block_range_hook = neon_set_lwlsn_block_range; prev_set_lwlsn_block_v_hook = set_lwlsn_block_v_hook; set_lwlsn_block_v_hook = neon_set_lwlsn_block_v; prev_set_lwlsn_block_hook = set_lwlsn_block_hook; set_lwlsn_block_hook = neon_set_lwlsn_block; - prev_set_lwlsn_relation_hook = set_lwlsn_relation_hook; - set_lwlsn_relation_hook = neon_set_lwlsn_relation; - prev_set_lwlsn_db_hook = set_lwlsn_db_hook; - set_lwlsn_db_hook = neon_set_lwlsn_db; prev_update_max_lwlsn_hook = update_max_lwlsn_hook; update_max_lwlsn_hook = neon_update_max_lwlsn; } diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 488bd46bb578..d252e9d6177e 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 488bd46bb578e0b386c9d0acb1f8f484d87849e0 +Subproject commit d252e9d6177ec01fd9730f9a131c38ed1c149b7a diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 409da40fe97a..df1727017d76 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 409da40fe97a62853fcc59132e2481d0680aa5ec +Subproject commit df1727017d761e9cd677d335f324af6b565bcc4c diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 382d4a827ac5..85287d32713d 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 382d4a827ac5e0c206b70efb6accd0dd104a4eab +Subproject commit 85287d32713d3d36af9f0b82bee3fa90ebb75b36 diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index cf73c345ff45..faff7e3b4572 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit cf73c345ff452b5f2deb50d198514616fddbd8ba +Subproject commit faff7e3b457265c672fd04cb71d364f5ec36ea74 diff --git a/vendor/revisions.json b/vendor/revisions.json index 1072b479f882..5ffc8d9092a8 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,18 +1,18 @@ { "v17": [ "17.4", - "cf73c345ff452b5f2deb50d198514616fddbd8ba" + "faff7e3b457265c672fd04cb71d364f5ec36ea74" ], "v16": [ "16.8", - "382d4a827ac5e0c206b70efb6accd0dd104a4eab" + "85287d32713d3d36af9f0b82bee3fa90ebb75b36" ], "v15": [ "15.12", - "409da40fe97a62853fcc59132e2481d0680aa5ec" + "df1727017d761e9cd677d335f324af6b565bcc4c" ], "v14": [ "14.17", - "488bd46bb578e0b386c9d0acb1f8f484d87849e0" + "d252e9d6177ec01fd9730f9a131c38ed1c149b7a" ] }