On Thu, Feb 6, 2025 at 8:23 PM Daniel Gustafsson <dan...@yesql.se> wrote: > > You should include the configure.ac changes and not just the generated code in > configure (which is fine to include for review, but the committer will > re-generate it regardless). Please also include the corresponding Meson > change > to keep the buildsystems in sync.
Thank you for your comment. I'm applying a patch that also includes configure.ac, meson_options.txt and meson.build changes. It would also be interesting to know what you think about the idea of allowing such a parameter to be configured. -- Best regards, Daniil Davydov
From 836d648297b8ede905115f4e823953ebfa273642 Mon Sep 17 00:00:00 2001 From: Daniil Davidov <d.davy...@postgrespro.ru> Date: Thu, 6 Feb 2025 14:34:36 +0700 Subject: [PATCH] SLRU_PAGES_PER_SEGMENT as configure parameter --- configure | 53 ++++++++ configure.ac | 36 +++++ meson.build | 17 +++ meson_options.txt | 3 + src/backend/utils/misc/guc_tables.c | 12 ++ src/include/access/slru.h | 15 --- src/include/pg_config.h.in | 15 +++ .../modules/test_slru/expected/test_slru.out | 123 ++++++++++-------- src/test/modules/test_slru/sql/test_slru.sql | 122 +++++++++++------ src/test/modules/test_slru/test_slru.c | 6 - 10 files changed, 287 insertions(+), 115 deletions(-) diff --git a/configure b/configure index 97996b7f6b..ff15660f5f 100755 --- a/configure +++ b/configure @@ -845,6 +845,7 @@ enable_dtrace enable_tap_tests enable_injection_points with_blocksize +with_slru_pps with_segsize with_segsize_blocks with_wal_blocksize @@ -1554,6 +1555,7 @@ Optional Packages: --with-pgport=PORTNUM set default port number [5432] --with-blocksize=BLOCKSIZE set table block size in kB [8] + --with-slru-pps=SLRUPPS set slru segment size in blocks --with-segsize=SEGSIZE set table segment size in GB [1] --with-segsize-blocks=SEGSIZE_BLOCKS set table segment size in blocks [0] @@ -3762,6 +3764,57 @@ cat >>confdefs.h <<_ACEOF _ACEOF +# +# SLRU pages per segment +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for slru pages per segment" >&5 +$as_echo_n "checking for slru pages per segment... " >&6; } + + + +# Check whether --with-slru-pps was given. +if test "${with_slru_pps+set}" = set; then : + withval=$with_slru_pps; + case $withval in + yes) + as_fn_error $? "argument required for --with-slru-pps option" "$LINENO" 5 + ;; + no) + as_fn_error $? "argument required for --with-slru-pps option" "$LINENO" 5 + ;; + *) + slru_pages_per_segment=$withval + ;; + esac + +else + slru_pages_per_segment=32 +fi + + + +INT_MAX=2147483647 +if test "${slru_pages_per_segment}" -lt 32; then : + as_fn_error $? "Invalid slru_pps value. It cannot be less than 32." "$LINENO" 5 +fi + +if test "${slru_pages_per_segment}" -gt "${INT_MAX}"; then : + as_fn_error $? "Invalid slru_pps value. It cannot be greater than INT_MAX." "$LINENO" 5 +fi + +if test $(expr ${slru_pages_per_segment} % 2) -ne 0; then : + as_fn_error $? "Invalid slru_pps value. It must be a power of 2." "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${slru_pages_per_segment} pages" >&5 +$as_echo "${slru_pages_per_segment} pages" >&6; } + + +cat >>confdefs.h <<_ACEOF +#define SLRU_PAGES_PER_SEGMENT ${slru_pages_per_segment} +_ACEOF + + # # Relation segment size # diff --git a/configure.ac b/configure.ac index 3c76c9ebc8..2fd0e331c0 100644 --- a/configure.ac +++ b/configure.ac @@ -288,6 +288,42 @@ AC_DEFINE_UNQUOTED([BLCKSZ], ${BLCKSZ}, [ Changing BLCKSZ requires an initdb. ]) +# +# SLRU pages per segment +# +AC_MSG_CHECKING([for slru pages per segment]) +PGAC_ARG_REQ(with, slru-pps, [SLRUPPS], [set slru segment size in blocks], + [slru_pages_per_segment=$withval], + [slru_pages_per_segment=32]) + +INT_MAX=2147483647 +AS_IF([test "${slru_pages_per_segment}" -lt 32], + [AC_MSG_ERROR([Invalid slru_pps value. It cannot be less than 32.])]) + +AS_IF([test "${slru_pages_per_segment}" -gt "${INT_MAX}"], + [AC_MSG_ERROR([Invalid slru_pps value. It cannot be greater than INT_MAX.])]) + +AS_IF([test $(expr ${slru_pages_per_segment} % 2) -ne 0], + [AC_MSG_ERROR([Invalid slru_pps value. It must be a power of 2.])]) + +AC_MSG_RESULT([${slru_pages_per_segment} pages]) + +AC_DEFINE_UNQUOTED([SLRU_PAGES_PER_SEGMENT], ${slru_pages_per_segment}, [ + SLRU segment size in pages. A page is the same BLCKSZ as is used everywhere + else in Postgres. The segment size can be chosen somewhat arbitrarily; + we make it 32 pages by default, or 256Kb, i.e. 1M transactions for CLOG + or 64K transactions for SUBTRANS. + + Note: because TransactionIds are 32 bits and wrap around at 0xFFFFFFFF, + default page numbering also wraps around at 0xFFFFFFFF/xxxx_XACTS_PER_PAGE + (where xxxx is CLOG or SUBTRANS, respectively), and segment numbering at + 0xFFFFFFFF/xxxx_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT. We need + take no explicit notice of that fact in slru.c, except when comparing + segment and page numbers in SimpleLruTruncate (see PagePrecedes()). + + Changing SLRU_PAGES_PER_SEGMENT requires an initdb. +]) + # # Relation segment size # diff --git a/meson.build b/meson.build index ed9f4737d3..2506de52f1 100644 --- a/meson.build +++ b/meson.build @@ -430,6 +430,8 @@ cdata.set('USE_INJECTION_POINTS', get_option('injection_points') ? 1 : false) blocksize = get_option('blocksize').to_int() * 1024 +slru_pages_per_segment = get_option('slru_pps').to_int() + if get_option('segsize_blocks') != 0 if get_option('segsize') != 1 warning('both segsize and segsize_blocks specified, segsize_blocks wins') @@ -449,6 +451,21 @@ cdata.set('BLCKSZ', blocksize, description: lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h). Changing BLCKSZ requires an initdb.''') +cdata.set('SLRU_PAGES_PER_SEGMENT', slru_pages_per_segment, description: +'''SLRU segment size in pages. A page is the same BLCKSZ as is used everywhere + else in Postgres. The segment size can be chosen somewhat arbitrarily; + we make it 32 pages by default, or 256Kb, i.e. 1M transactions for CLOG + or 64K transactions for SUBTRANS. + + Note: because TransactionIds are 32 bits and wrap around at 0xFFFFFFFF, + default page numbering also wraps around at 0xFFFFFFFF/xxxx_XACTS_PER_PAGE + (where xxxx is CLOG or SUBTRANS, respectively), and segment numbering at + 0xFFFFFFFF/xxxx_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT. We need + take no explicit notice of that fact in slru.c, except when comparing + segment and page numbers in SimpleLruTruncate (see PagePrecedes()). + + Changing SLRU_PAGES_PER_SEGMENT requires an initdb.''') + cdata.set('XLOG_BLCKSZ', get_option('wal_blocksize').to_int() * 1024) cdata.set('RELSEG_SIZE', segsize) cdata.set('DEF_PGPORT', get_option('pgport')) diff --git a/meson_options.txt b/meson_options.txt index 246cecf382..ca26aa526c 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,6 +7,9 @@ option('blocksize', type: 'combo', value: '8', description: 'Relation block size, in kilobytes') +option('slru_pps', type: 'integer', value: 32, + description: 'SLRU segment size, in blocks') + option('wal_blocksize', type: 'combo', choices: ['1', '2', '4', '8', '16', '32', '64'], value: '8', diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index c42fccf3fe..bf1aa3a56c 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -596,6 +596,7 @@ static int max_function_args; static int max_index_keys; static int max_identifier_length; static int block_size; +static int slru_pages_per_segment; static int segment_size; static int shared_memory_size_mb; static int shared_memory_size_in_huge_pages; @@ -3266,6 +3267,17 @@ struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + { + {"slru_pps", PGC_INTERNAL, PRESET_OPTIONS, + gettext_noop("Shows the number of slru pages per segment."), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &slru_pages_per_segment, + SLRU_PAGES_PER_SEGMENT, SLRU_PAGES_PER_SEGMENT, SLRU_PAGES_PER_SEGMENT, + NULL, NULL, NULL + }, + { {"segment_size", PGC_INTERNAL, PRESET_OPTIONS, gettext_noop("Shows the number of pages per disk file."), diff --git a/src/include/access/slru.h b/src/include/access/slru.h index 02fcb3bca5..c75fc215d1 100644 --- a/src/include/access/slru.h +++ b/src/include/access/slru.h @@ -23,21 +23,6 @@ */ #define SLRU_MAX_ALLOWED_BUFFERS ((1024 * 1024 * 1024) / BLCKSZ) -/* - * Define SLRU segment size. A page is the same BLCKSZ as is used everywhere - * else in Postgres. The segment size can be chosen somewhat arbitrarily; - * we make it 32 pages by default, or 256Kb, i.e. 1M transactions for CLOG - * or 64K transactions for SUBTRANS. - * - * Note: because TransactionIds are 32 bits and wrap around at 0xFFFFFFFF, - * page numbering also wraps around at 0xFFFFFFFF/xxxx_XACTS_PER_PAGE (where - * xxxx is CLOG or SUBTRANS, respectively), and segment numbering at - * 0xFFFFFFFF/xxxx_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT. We need - * take no explicit notice of that fact in slru.c, except when comparing - * segment and page numbers in SimpleLruTruncate (see PagePrecedes()). - */ -#define SLRU_PAGES_PER_SEGMENT 32 - /* * Page status codes. Note that these do not include the "dirty" bit. * page_dirty can be true only in the VALID or WRITE_IN_PROGRESS states; diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 2397d90b46..18e012a6b3 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -30,6 +30,21 @@ Changing BLCKSZ requires an initdb. */ #undef BLCKSZ +/* SLRU segment size in pages. A page is the same BLCKSZ as is used everywhere + else in Postgres. The segment size can be chosen somewhat arbitrarily; + we make it 32 pages by default, or 256Kb, i.e. 1M transactions for CLOG + or 64K transactions for SUBTRANS. + + Note: because TransactionIds are 32 bits and wrap around at 0xFFFFFFFF, + default page numbering also wraps around at 0xFFFFFFFF/xxxx_XACTS_PER_PAGE + (where xxxx is CLOG or SUBTRANS, respectively), and segment numbering at + 0xFFFFFFFF/xxxx_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT. We need + take no explicit notice of that fact in slru.c, except when comparing + segment and page numbers in SimpleLruTruncate (see PagePrecedes()). + + Changing SLRU_PAGES_PER_SEGMENT requires an initdb. */ +#undef SLRU_PAGES_PER_SEGMENT + /* Saved arguments from configure */ #undef CONFIGURE_ARGS diff --git a/src/test/modules/test_slru/expected/test_slru.out b/src/test/modules/test_slru/expected/test_slru.out index 185c56e5d6..1184db276d 100644 --- a/src/test/modules/test_slru/expected/test_slru.out +++ b/src/test/modules/test_slru/expected/test_slru.out @@ -1,52 +1,62 @@ CREATE EXTENSION test_slru; -SELECT test_slru_page_exists(12345); +-- how many pages can fit on one slru segment +SELECT current_setting('slru_pps')::INT AS slru_pps \gset +SELECT (:slru_pps * 6.8125) AS pageno \gset +-- count from zero +SELECT (:pageno + (:slru_pps * 1.5) - 1) AS pageno_max \gset +SELECT (:pageno_max - (:slru_pps / 2)) AS pageno_middle \gset +-- non existed page +SELECT test_slru_page_exists(:pageno::BIGINT); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_write(12345, 'Test SLRU'); +SELECT test_slru_page_write(:pageno::BIGINT, 'Test SLRU'); test_slru_page_write ---------------------- (1 row) -SELECT test_slru_page_read(12345); +SELECT test_slru_page_read(:pageno::BIGINT); test_slru_page_read --------------------- Test SLRU (1 row) -SELECT test_slru_page_exists(12345); +SELECT test_slru_page_exists(:pageno::BIGINT); test_slru_page_exists ----------------------- t (1 row) --- 48 extra pages -SELECT count(test_slru_page_write(a, 'Test SLRU')) - FROM generate_series(12346, 12393, 1) as a; - count -------- - 48 -(1 row) - +-- Generate extra pages. Redirect output into table because number of funciton +-- calls depends on the current value of slru_pps parameter. +CREATE TABLE slru_write_results ( + pageno BIGINT, + write_count INTEGER +); +INSERT INTO slru_write_results (pageno, write_count) +SELECT a, count(test_slru_page_write(a::BIGINT, 'Test SLRU')) +FROM generate_series(:pageno, :pageno_max, 1) AS a +GROUP BY a; +DROP TABLE slru_write_results; -- Reading page in buffer for read and write -SELECT test_slru_page_read(12377, true); +SELECT test_slru_page_read(:pageno_middle::BIGINT, true); test_slru_page_read --------------------- Test SLRU (1 row) -- Reading page in buffer for read-only -SELECT test_slru_page_readonly(12377); +SELECT test_slru_page_readonly(:pageno_middle::BIGINT); test_slru_page_readonly ------------------------- Test SLRU (1 row) -- Reading page not in buffer with read-only -SELECT test_slru_page_readonly(12346); +SELECT test_slru_page_readonly(:pageno::BIGINT); test_slru_page_readonly ------------------------- Test SLRU @@ -60,47 +70,45 @@ SELECT test_slru_page_writeall(); (1 row) -- Flush the last page written out. -SELECT test_slru_page_sync(12393); -NOTICE: Called SlruSyncFileTag() for segment 387 on path pg_test_slru/000000000000183 +SELECT test_slru_page_sync(:pageno_max::BIGINT); test_slru_page_sync --------------------- (1 row) -SELECT test_slru_page_exists(12393); +SELECT test_slru_page_exists(:pageno_max::BIGINT); test_slru_page_exists ----------------------- t (1 row) -- Segment deletion -SELECT test_slru_page_delete(12393); -NOTICE: Called SlruDeleteSegment() for segment 387 +SELECT test_slru_page_delete(:pageno_max::BIGINT); test_slru_page_delete ----------------------- (1 row) -SELECT test_slru_page_exists(12393); +SELECT test_slru_page_exists(:pageno_max::BIGINT); test_slru_page_exists ----------------------- f (1 row) -- Page truncation -SELECT test_slru_page_exists(12377); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); test_slru_page_exists ----------------------- t (1 row) -SELECT test_slru_page_truncate(12377); +SELECT test_slru_page_truncate(:pageno_middle::BIGINT); test_slru_page_truncate ------------------------- (1 row) -SELECT test_slru_page_exists(12377); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); test_slru_page_exists ----------------------- t @@ -114,19 +122,19 @@ NOTICE: Calling test_slru_scan_cb() (1 row) -SELECT test_slru_page_exists(12345); +SELECT test_slru_page_exists(:pageno::BIGINT); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_exists(12377); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_exists(12393); +SELECT test_slru_page_exists(:pageno_max::BIGINT); test_slru_page_exists ----------------------- f @@ -135,54 +143,63 @@ SELECT test_slru_page_exists(12393); -- -- Test 64-bit pages -- -SELECT test_slru_page_exists(0x1234500000000); +\set no_such_page 0x1234500000000 +-- second page in SLRU segments +\set pageno 0x1234500000001 +-- count from zero +SELECT (:no_such_page + (:slru_pps * 1.5)) AS pageno_max \gset +SELECT (:pageno_max - (:slru_pps / 2)) AS pageno_middle \gset +SELECT test_slru_page_exists(:no_such_page); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_write(0x1234500000000, 'Test SLRU 64-bit'); +SELECT test_slru_page_write(:no_such_page, 'Test SLRU 64-bit'); test_slru_page_write ---------------------- (1 row) -SELECT test_slru_page_read(0x1234500000000); +SELECT test_slru_page_read(:no_such_page); test_slru_page_read --------------------- Test SLRU 64-bit (1 row) -SELECT test_slru_page_exists(0x1234500000000); +SELECT test_slru_page_exists(:no_such_page); test_slru_page_exists ----------------------- t (1 row) --- 48 extra pages -SELECT count(test_slru_page_write(a, 'Test SLRU 64-bit')) - FROM generate_series(0x1234500000001, 0x1234500000030, 1) as a; - count -------- - 48 -(1 row) - +-- Generate extra pages. Redirect output into table because number of funciton +-- calls depends on the current value of slru_pps parameter. +CREATE TABLE slru_write_results ( + pageno BIGINT, + write_count INTEGER +); +INSERT INTO slru_write_results (pageno, write_count) +SELECT a, count(test_slru_page_write(a::BIGINT, 'Test SLRU 64-bit')) +FROM generate_series(:pageno, :pageno_max, 1) AS a +GROUP BY a; +DROP TABLE slru_write_results; -- Reading page in buffer for read and write -SELECT test_slru_page_read(0x1234500000020, true); +SELECT test_slru_page_read(:pageno_middle::BIGINT, true); test_slru_page_read --------------------- Test SLRU 64-bit (1 row) -- Reading page in buffer for read-only -SELECT test_slru_page_readonly(0x1234500000020); +SELECT test_slru_page_readonly(:pageno_middle::BIGINT); test_slru_page_readonly ------------------------- Test SLRU 64-bit (1 row) -- Reading page not in buffer with read-only -SELECT test_slru_page_readonly(0x1234500000001); +SELECT test_slru_page_readonly(:pageno); test_slru_page_readonly ------------------------- Test SLRU 64-bit @@ -196,47 +213,45 @@ SELECT test_slru_page_writeall(); (1 row) -- Flush the last page written out. -SELECT test_slru_page_sync(0x1234500000030); -NOTICE: Called SlruSyncFileTag() for segment 10007944888321 on path pg_test_slru/000091A28000001 +SELECT test_slru_page_sync(:pageno_max::BIGINT); test_slru_page_sync --------------------- (1 row) -SELECT test_slru_page_exists(0x1234500000030); +SELECT test_slru_page_exists(:pageno_max::BIGINT); test_slru_page_exists ----------------------- t (1 row) -- Segment deletion -SELECT test_slru_page_delete(0x1234500000030); -NOTICE: Called SlruDeleteSegment() for segment 10007944888321 +SELECT test_slru_page_delete(:pageno_max::BIGINT); test_slru_page_delete ----------------------- (1 row) -SELECT test_slru_page_exists(0x1234500000030); +SELECT test_slru_page_exists(:pageno_max::BIGINT); test_slru_page_exists ----------------------- f (1 row) -- Page truncation -SELECT test_slru_page_exists(0x1234500000020); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_truncate(0x1234500000020); +SELECT test_slru_page_truncate(:pageno_middle::BIGINT); test_slru_page_truncate ------------------------- (1 row) -SELECT test_slru_page_exists(0x1234500000020); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); test_slru_page_exists ----------------------- f @@ -249,19 +264,19 @@ SELECT test_slru_delete_all(); (1 row) -SELECT test_slru_page_exists(0x1234500000000); +SELECT test_slru_page_exists(:no_such_page); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_exists(0x1234500000020); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); test_slru_page_exists ----------------------- f (1 row) -SELECT test_slru_page_exists(0x1234500000030); +SELECT test_slru_page_exists(:pageno_max::BIGINT); test_slru_page_exists ----------------------- f diff --git a/src/test/modules/test_slru/sql/test_slru.sql b/src/test/modules/test_slru/sql/test_slru.sql index b1b376581a..ee6bd32353 100644 --- a/src/test/modules/test_slru/sql/test_slru.sql +++ b/src/test/modules/test_slru/sql/test_slru.sql @@ -1,76 +1,118 @@ CREATE EXTENSION test_slru; -SELECT test_slru_page_exists(12345); -SELECT test_slru_page_write(12345, 'Test SLRU'); -SELECT test_slru_page_read(12345); -SELECT test_slru_page_exists(12345); +-- how many pages can fit on one slru segment +SELECT current_setting('slru_pps')::INT AS slru_pps \gset --- 48 extra pages -SELECT count(test_slru_page_write(a, 'Test SLRU')) - FROM generate_series(12346, 12393, 1) as a; +SELECT (:slru_pps * 6.8125) AS pageno \gset + +-- count from zero +SELECT (:pageno + (:slru_pps * 1.5) - 1) AS pageno_max \gset + +SELECT (:pageno_max - (:slru_pps / 2)) AS pageno_middle \gset + +-- non existed page +SELECT test_slru_page_exists(:pageno::BIGINT); +SELECT test_slru_page_write(:pageno::BIGINT, 'Test SLRU'); +SELECT test_slru_page_read(:pageno::BIGINT); +SELECT test_slru_page_exists(:pageno::BIGINT); + +-- Generate extra pages. Redirect output into table because number of funciton +-- calls depends on the current value of slru_pps parameter. + +CREATE TABLE slru_write_results ( + pageno BIGINT, + write_count INTEGER +); + +INSERT INTO slru_write_results (pageno, write_count) +SELECT a, count(test_slru_page_write(a::BIGINT, 'Test SLRU')) +FROM generate_series(:pageno, :pageno_max, 1) AS a +GROUP BY a; + +DROP TABLE slru_write_results; -- Reading page in buffer for read and write -SELECT test_slru_page_read(12377, true); +SELECT test_slru_page_read(:pageno_middle::BIGINT, true); -- Reading page in buffer for read-only -SELECT test_slru_page_readonly(12377); +SELECT test_slru_page_readonly(:pageno_middle::BIGINT); -- Reading page not in buffer with read-only -SELECT test_slru_page_readonly(12346); +SELECT test_slru_page_readonly(:pageno::BIGINT); -- Write all the pages in buffers SELECT test_slru_page_writeall(); -- Flush the last page written out. -SELECT test_slru_page_sync(12393); -SELECT test_slru_page_exists(12393); +SELECT test_slru_page_sync(:pageno_max::BIGINT); +SELECT test_slru_page_exists(:pageno_max::BIGINT); -- Segment deletion -SELECT test_slru_page_delete(12393); -SELECT test_slru_page_exists(12393); +SELECT test_slru_page_delete(:pageno_max::BIGINT); +SELECT test_slru_page_exists(:pageno_max::BIGINT); -- Page truncation -SELECT test_slru_page_exists(12377); -SELECT test_slru_page_truncate(12377); -SELECT test_slru_page_exists(12377); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); +SELECT test_slru_page_truncate(:pageno_middle::BIGINT); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); -- Full deletion SELECT test_slru_delete_all(); -SELECT test_slru_page_exists(12345); -SELECT test_slru_page_exists(12377); -SELECT test_slru_page_exists(12393); +SELECT test_slru_page_exists(:pageno::BIGINT); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); +SELECT test_slru_page_exists(:pageno_max::BIGINT); -- -- Test 64-bit pages -- -SELECT test_slru_page_exists(0x1234500000000); -SELECT test_slru_page_write(0x1234500000000, 'Test SLRU 64-bit'); -SELECT test_slru_page_read(0x1234500000000); -SELECT test_slru_page_exists(0x1234500000000); +\set no_such_page 0x1234500000000 +-- second page in SLRU segments +\set pageno 0x1234500000001 + +-- count from zero +SELECT (:no_such_page + (:slru_pps * 1.5)) AS pageno_max \gset + +SELECT (:pageno_max - (:slru_pps / 2)) AS pageno_middle \gset + +SELECT test_slru_page_exists(:no_such_page); +SELECT test_slru_page_write(:no_such_page, 'Test SLRU 64-bit'); +SELECT test_slru_page_read(:no_such_page); +SELECT test_slru_page_exists(:no_such_page); + +-- Generate extra pages. Redirect output into table because number of funciton +-- calls depends on the current value of slru_pps parameter. + +CREATE TABLE slru_write_results ( + pageno BIGINT, + write_count INTEGER +); + +INSERT INTO slru_write_results (pageno, write_count) +SELECT a, count(test_slru_page_write(a::BIGINT, 'Test SLRU 64-bit')) +FROM generate_series(:pageno, :pageno_max, 1) AS a +GROUP BY a; --- 48 extra pages -SELECT count(test_slru_page_write(a, 'Test SLRU 64-bit')) - FROM generate_series(0x1234500000001, 0x1234500000030, 1) as a; +DROP TABLE slru_write_results; -- Reading page in buffer for read and write -SELECT test_slru_page_read(0x1234500000020, true); +SELECT test_slru_page_read(:pageno_middle::BIGINT, true); -- Reading page in buffer for read-only -SELECT test_slru_page_readonly(0x1234500000020); +SELECT test_slru_page_readonly(:pageno_middle::BIGINT); -- Reading page not in buffer with read-only -SELECT test_slru_page_readonly(0x1234500000001); +SELECT test_slru_page_readonly(:pageno); -- Write all the pages in buffers SELECT test_slru_page_writeall(); -- Flush the last page written out. -SELECT test_slru_page_sync(0x1234500000030); -SELECT test_slru_page_exists(0x1234500000030); +SELECT test_slru_page_sync(:pageno_max::BIGINT); +SELECT test_slru_page_exists(:pageno_max::BIGINT); -- Segment deletion -SELECT test_slru_page_delete(0x1234500000030); -SELECT test_slru_page_exists(0x1234500000030); +SELECT test_slru_page_delete(:pageno_max::BIGINT); +SELECT test_slru_page_exists(:pageno_max::BIGINT); -- Page truncation -SELECT test_slru_page_exists(0x1234500000020); -SELECT test_slru_page_truncate(0x1234500000020); -SELECT test_slru_page_exists(0x1234500000020); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); +SELECT test_slru_page_truncate(:pageno_middle::BIGINT); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); -- Full deletion SELECT test_slru_delete_all(); -SELECT test_slru_page_exists(0x1234500000000); -SELECT test_slru_page_exists(0x1234500000020); -SELECT test_slru_page_exists(0x1234500000030); +SELECT test_slru_page_exists(:no_such_page); +SELECT test_slru_page_exists(:pageno_middle::BIGINT); +SELECT test_slru_page_exists(:pageno_max::BIGINT); DROP EXTENSION test_slru; diff --git a/src/test/modules/test_slru/test_slru.c b/src/test/modules/test_slru/test_slru.c index d227b06703..7c55798dc8 100644 --- a/src/test/modules/test_slru/test_slru.c +++ b/src/test/modules/test_slru/test_slru.c @@ -151,9 +151,6 @@ test_slru_page_sync(PG_FUNCTION_ARGS) ftag.segno = pageno / SLRU_PAGES_PER_SEGMENT; SlruSyncFileTag(TestSlruCtl, &ftag, path); - elog(NOTICE, "Called SlruSyncFileTag() for segment %lld on path %s", - (long long) ftag.segno, path); - PG_RETURN_VOID(); } @@ -166,9 +163,6 @@ test_slru_page_delete(PG_FUNCTION_ARGS) ftag.segno = pageno / SLRU_PAGES_PER_SEGMENT; SlruDeleteSegment(TestSlruCtl, ftag.segno); - elog(NOTICE, "Called SlruDeleteSegment() for segment %lld", - (long long) ftag.segno); - PG_RETURN_VOID(); } -- 2.43.0