diff --git a/pgxn/neon/neon_lwlsncache.c b/pgxn/neon/neon_lwlsncache.c index 5887c02c3697..ed93d00cb183 100644 --- a/pgxn/neon/neon_lwlsncache.c +++ b/pgxn/neon/neon_lwlsncache.c @@ -332,8 +332,8 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, for (i = 0; i < n_blocks; i++) { key.blockNum = from + i; - entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found); - if (found) + entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL); + if (entry != NULL) { if (lsn > entry->lsn) entry->lsn = lsn; @@ -344,8 +344,7 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, } else { - entry->lsn = lsn; - if (hash_get_num_entries(lastWrittenLsnCache) > LwLsnCache->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(&LwLsnCache->lastWrittenLsnLRU)); @@ -355,6 +354,10 @@ SetLastWrittenLSNForBlockRangeInternal(XLogRecPtr lsn, hash_search(lastWrittenLsnCache, victim, HASH_REMOVE, NULL); } + + entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found); + Assert(!found); + entry->lsn = lsn; } /* Link to the end of LRU list */ dlist_push_tail(&LwLsnCache->lastWrittenLsnLRU, &entry->lru_node); @@ -429,8 +432,8 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, Assert(lsn >= WalSegMinSize); key.blockNum = blockno + i; - entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found); - if (found) + entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL); + if (entry != NULL) { if (lsn > entry->lsn) entry->lsn = lsn; @@ -441,8 +444,7 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, } else { - entry->lsn = lsn; - if (hash_get_num_entries(lastWrittenLsnCache) > LwLsnCache->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(&LwLsnCache->lastWrittenLsnLRU)); @@ -452,6 +454,9 @@ neon_set_lwlsn_block_v(const XLogRecPtr *lsns, NRelFileInfo relfilenode, hash_search(lastWrittenLsnCache, victim, HASH_REMOVE, NULL); } + entry = hash_search(lastWrittenLsnCache, &key, HASH_ENTER, &found); + Assert(!found); + entry->lsn = lsn; } /* Link to the end of LRU list */ dlist_push_tail(&LwLsnCache->lastWrittenLsnLRU, &entry->lru_node);