From e9868966760ba3459810474e43049af735f3727e Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Fri, 23 Aug 2024 14:28:04 +0300 Subject: [PATCH] Add dump_relsize_cache() function Quite useful for seeing what's in the cache. --- docs/core_changes.md | 5 ++ pgxn/neon/pagestore_client.h | 3 + pgxn/neon/relsize_cache.c | 59 +++++++++++++++++++ pgxn/neon_test_utils/Makefile | 2 +- ...tils--1.3.sql => neon_test_utils--1.4.sql} | 5 ++ pgxn/neon_test_utils/neon_test_utils.control | 2 +- pgxn/neon_test_utils/neontest.c | 19 ++++++ 7 files changed, 93 insertions(+), 2 deletions(-) rename pgxn/neon_test_utils/{neon_test_utils--1.3.sql => neon_test_utils--1.4.sql} (94%) diff --git a/docs/core_changes.md b/docs/core_changes.md index 1388317728..bfb143a906 100644 --- a/docs/core_changes.md +++ b/docs/core_changes.md @@ -441,6 +441,11 @@ WAL-log them periodically, from a backgound worker. Similarly to replications snapshot files, the CID mapping files generated during VACUUM FULL of a catalog table are WAL-logged +FIXME: But they're not, AFAICS? + +FIXME: However, we do WAL-log the file in pg_logical/mappings. But AFAICS that's WAL-logged +by PostgreSQL too. Why do we need separate WAL-logging for that? See changes in rewriteheap.c + ### How to get rid of the patch WAL-log them periodically, from a backgound worker. diff --git a/pgxn/neon/pagestore_client.h b/pgxn/neon/pagestore_client.h index 8951e6607b..2a5547c5cb 100644 --- a/pgxn/neon/pagestore_client.h +++ b/pgxn/neon/pagestore_client.h @@ -284,6 +284,9 @@ extern PGDLLEXPORT void neon_read_at_lsn(NRelFileInfo rnode, ForkNumber forkNum, extern void neon_write(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void *buffer, bool skipFsync); #endif + +extern PGDLLEXPORT void neon_dump_relsize_cache(void); + extern void neon_writeback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks); extern BlockNumber neon_nblocks(SMgrRelation reln, ForkNumber forknum); diff --git a/pgxn/neon/relsize_cache.c b/pgxn/neon/relsize_cache.c index 2a4c2dc799..3293c3d44e 100644 --- a/pgxn/neon/relsize_cache.c +++ b/pgxn/neon/relsize_cache.c @@ -277,3 +277,62 @@ relsize_shmem_request(void) RequestNamedLWLockTranche("neon_relsize", 1); } #endif + + +/* + * A debugging function, to print the contents of the relsize cache as NOTICE + * messages. This is exposed in the neon_test_utils extension. + */ +void +neon_dump_relsize_cache(void) +{ + HASH_SEQ_STATUS status; + RelSizeEntry *entry; + dlist_iter iter; + int cnt; + + if (relsize_hash_size == 0) + { + elog(NOTICE, "relsize cache is disable"); + return; + } + + LWLockAcquire(relsize_lock, LW_EXCLUSIVE); + + elog(NOTICE, "stats: size %lu hits: " UINT64_FORMAT " misses " UINT64_FORMAT " writes " UINT64_FORMAT, + (unsigned long) relsize_ctl->size, relsize_ctl->hits, relsize_ctl->misses, relsize_ctl->writes); + + elog(NOTICE, "hash:"); + cnt = 0; + hash_seq_init(&status, relsize_hash); + while ((entry = hash_seq_search(&status)) != NULL) + { + cnt++; + elog(NOTICE, "hash entry %d: rel %u/%u/%u.%u size %u", + cnt, + RelFileInfoFmt(entry->tag.rinfo), + entry->tag.forknum, + entry->size); + } + + elog(NOTICE, "LRU:"); + cnt = 0; + dlist_foreach(iter, &relsize_ctl->lru) + { + entry = dlist_container(RelSizeEntry, lru_node, iter.cur); + cnt++; + elog(NOTICE, "LRU entry %d: rel %u/%u/%u.%u size %u", + cnt, + RelFileInfoFmt(entry->tag.rinfo), + entry->tag.forknum, + entry->size); + + if (cnt > relsize_hash_size * 2) + { + elog(NOTICE, "broken LRU chain??"); + break; + } + } + + LWLockRelease(relsize_lock); +} diff --git a/pgxn/neon_test_utils/Makefile b/pgxn/neon_test_utils/Makefile index 252810b5b0..0672ef4854 100644 --- a/pgxn/neon_test_utils/Makefile +++ b/pgxn/neon_test_utils/Makefile @@ -7,7 +7,7 @@ OBJS = \ neontest.o EXTENSION = neon_test_utils -DATA = neon_test_utils--1.3.sql +DATA = neon_test_utils--1.4.sql PGFILEDESC = "neon_test_utils - helpers for neon testing and debugging" PG_CONFIG = pg_config diff --git a/pgxn/neon_test_utils/neon_test_utils--1.3.sql b/pgxn/neon_test_utils/neon_test_utils--1.4.sql similarity index 94% rename from pgxn/neon_test_utils/neon_test_utils--1.3.sql rename to pgxn/neon_test_utils/neon_test_utils--1.4.sql index 9a9b41c3a3..4603377b26 100644 --- a/pgxn/neon_test_utils/neon_test_utils--1.3.sql +++ b/pgxn/neon_test_utils/neon_test_utils--1.4.sql @@ -69,3 +69,8 @@ BEGIN PERFORM trigger_segfault(); END; $$; + +CREATE FUNCTION dump_relsize_cache() +RETURNS VOID +AS 'MODULE_PATHNAME', 'dump_relsize_cache' +LANGUAGE C PARALLEL UNSAFE; diff --git a/pgxn/neon_test_utils/neon_test_utils.control b/pgxn/neon_test_utils/neon_test_utils.control index f22afd70c4..30078403ef 100644 --- a/pgxn/neon_test_utils/neon_test_utils.control +++ b/pgxn/neon_test_utils/neon_test_utils.control @@ -1,6 +1,6 @@ # neon_test_utils extension comment = 'helpers for neon testing and debugging' -default_version = '1.3' +default_version = '1.4' module_pathname = '$libdir/neon_test_utils' relocatable = true trusted = true diff --git a/pgxn/neon_test_utils/neontest.c b/pgxn/neon_test_utils/neontest.c index 0b5499ca53..5eb6b9270e 100644 --- a/pgxn/neon_test_utils/neontest.c +++ b/pgxn/neon_test_utils/neontest.c @@ -45,6 +45,7 @@ PG_FUNCTION_INFO_V1(get_raw_page_at_lsn_ex); PG_FUNCTION_INFO_V1(neon_xlogflush); PG_FUNCTION_INFO_V1(trigger_panic); PG_FUNCTION_INFO_V1(trigger_segfault); +PG_FUNCTION_INFO_V1(dump_relsize_cache); /* * Linkage to functions in neon module. @@ -60,6 +61,10 @@ typedef void (*neon_read_at_lsn_type) (NRelFileInfo rinfo, ForkNumber forkNum, B static neon_read_at_lsn_type neon_read_at_lsn_ptr; +typedef void (*neon_dump_relsize_cache_type) (void); + +static neon_dump_relsize_cache_type neon_dump_relsize_cache_ptr; + /* * Module initialize function: fetch function pointers for cross-module calls. */ @@ -68,12 +73,18 @@ _PG_init(void) { /* Asserts verify that typedefs above match original declarations */ AssertVariableIsOfType(&neon_read_at_lsn, neon_read_at_lsn_type); + AssertVariableIsOfType(&neon_dump_relsize_cache, neon_dump_relsize_cache_type); neon_read_at_lsn_ptr = (neon_read_at_lsn_type) load_external_function("$libdir/neon", "neon_read_at_lsn", true, NULL); + + neon_dump_relsize_cache_ptr = (neon_dump_relsize_cache_type) + load_external_function("$libdir/neon", "neon_dump_relsize_cache", + true, NULL); } #define neon_read_at_lsn neon_read_at_lsn_ptr +#define neon_dump_relsize_cache neon_dump_relsize_cache_ptr /* * test_consume_oids(int4), for rapidly consuming OIDs, to test wraparound. @@ -528,3 +539,11 @@ trigger_segfault(PG_FUNCTION_ARGS) *ptr = 42; PG_RETURN_VOID(); } + + +Datum +dump_relsize_cache(PG_FUNCTION_ARGS) +{ + neon_dump_relsize_cache(); + PG_RETURN_VOID(); +}