From ea4c44bbeef122e5ccfe02ed33b5c40c2d9cda96 Mon Sep 17 00:00:00 2001 From: Maxim Orlov Date: Tue, 7 Nov 2023 18:44:19 +0300 Subject: [PATCH v59 4/4] Add SLRU tests for 64-bit page case Previously, we add 64-bit naming for SLRU segments. But no tests were provided, so add test for "long" SLRU segments name, i.e. for 64-bit variant of it. Author: Maxim Orlov Discussion: https://postgr.es/m/CAJ7c6TPDOYBYrnCAeyndkBktO0WG2xSdYduTF0nxq%2BvfkmTF5Q%40mail.gmail.com --- .../modules/test_slru/expected/test_slru.out | 151 ++++++++++++++++++ src/test/modules/test_slru/sql/test_slru.sql | 46 +++++- src/test/modules/test_slru/test_slru--1.0.sql | 2 + src/test/modules/test_slru/test_slru.c | 12 ++ 4 files changed, 210 insertions(+), 1 deletion(-) diff --git a/src/test/modules/test_slru/expected/test_slru.out b/src/test/modules/test_slru/expected/test_slru.out index 0e66fdc205..7e09722766 100644 --- a/src/test/modules/test_slru/expected/test_slru.out +++ b/src/test/modules/test_slru/expected/test_slru.out @@ -1,4 +1,7 @@ CREATE EXTENSION test_slru; +-- +-- Test cases for a "normal", i.e. 32 bit pages. +-- SELECT test_slru_page_exists(12345); test_slru_page_exists ----------------------- @@ -132,4 +135,152 @@ SELECT test_slru_page_exists(12393); f (1 row) +-- +-- Now same as above, but for "long", i.e. 64 bit pages. +-- +SELECT test_slru_allow_long_names(); + test_slru_allow_long_names +---------------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000000); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_write(0x1234500000000, 'Test SLRU with 64 bit pages'); + test_slru_page_write +---------------------- + +(1 row) + +SELECT test_slru_page_read(0x1234500000000); + test_slru_page_read +----------------------------- + Test SLRU with 64 bit pages +(1 row) + +SELECT test_slru_page_exists(0x1234500000000); + test_slru_page_exists +----------------------- + t +(1 row) + +-- 48 extra pages +SELECT count(test_slru_page_write(a, 'Test SLRU with 64 bit pages')) + FROM generate_series(0x1234500000001, 0x1234500000030, 1) as a; + count +------- + 48 +(1 row) + + -- Reading page in buffer for read and write +SELECT test_slru_page_read(0x1234500000025, true); + test_slru_page_read +----------------------------- + Test SLRU with 64 bit pages +(1 row) + +-- Reading page in buffer for read-only +SELECT test_slru_page_readonly(0x1234500000025); + test_slru_page_readonly +----------------------------- + Test SLRU with 64 bit pages +(1 row) + +-- Reading page not in buffer with read-only +SELECT test_slru_page_readonly(0x1234500000001); + test_slru_page_readonly +----------------------------- + Test SLRU with 64 bit pages +(1 row) + +-- Write all the pages in buffers +SELECT test_slru_page_writeall(); + test_slru_page_writeall +------------------------- + +(1 row) + +-- Flush the last page written out. +SELECT test_slru_page_sync(0x1234500000025); +NOTICE: Called SlruSyncFileTag() for segment 10007944888321 on path pg_test_slru/000091A28000001 + test_slru_page_sync +--------------------- + +(1 row) + +SELECT test_slru_page_sync(0x1234500000030); +NOTICE: Called SlruSyncFileTag() for segment 10007944888321 on path pg_test_slru/000091A28000001 + test_slru_page_sync +--------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000030); + test_slru_page_exists +----------------------- + t +(1 row) + +-- Segment deletion +SELECT test_slru_page_delete(0x1234500000030); +NOTICE: Called SlruDeleteSegment() for segment 10007944888321 + test_slru_page_delete +----------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000030); + test_slru_page_exists +----------------------- + f +(1 row) + +-- Page truncation +SELECT test_slru_page_exists(0x1234500000025); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_truncate(0x1234500000025); + test_slru_page_truncate +------------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000025); + test_slru_page_exists +----------------------- + f +(1 row) + +-- Full deletion +SELECT test_slru_delete_all(); + test_slru_delete_all +---------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000000); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_exists(0x1234500000025); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_exists(0x1234500000030); + test_slru_page_exists +----------------------- + f +(1 row) + DROP EXTENSION test_slru; diff --git a/src/test/modules/test_slru/sql/test_slru.sql b/src/test/modules/test_slru/sql/test_slru.sql index fe0d1342a9..14e45c4d1f 100644 --- a/src/test/modules/test_slru/sql/test_slru.sql +++ b/src/test/modules/test_slru/sql/test_slru.sql @@ -1,5 +1,8 @@ CREATE EXTENSION test_slru; +-- +-- Test cases for a "normal", i.e. 32 bit pages. +-- SELECT test_slru_page_exists(12345); SELECT test_slru_page_write(12345, 'Test SLRU'); SELECT test_slru_page_read(12345); @@ -35,4 +38,45 @@ SELECT test_slru_page_exists(12345); SELECT test_slru_page_exists(12377); SELECT test_slru_page_exists(12393); -DROP EXTENSION test_slru; +-- +-- Now same as above, but for "long", i.e. 64 bit pages. +-- +SELECT test_slru_allow_long_names(); + +SELECT test_slru_page_exists(0x1234500000000); +SELECT test_slru_page_write(0x1234500000000, 'Test SLRU with 64 bit pages'); +SELECT test_slru_page_read(0x1234500000000); +SELECT test_slru_page_exists(0x1234500000000); + +-- 48 extra pages +SELECT count(test_slru_page_write(a, 'Test SLRU with 64 bit pages')) + FROM generate_series(0x1234500000001, 0x1234500000030, 1) as a; + + -- Reading page in buffer for read and write +SELECT test_slru_page_read(0x1234500000025, true); +-- Reading page in buffer for read-only +SELECT test_slru_page_readonly(0x1234500000025); +-- Reading page not in buffer with read-only +SELECT test_slru_page_readonly(0x1234500000001); + +-- Write all the pages in buffers +SELECT test_slru_page_writeall(); +-- Flush the last page written out. +SELECT test_slru_page_sync(0x1234500000025); +SELECT test_slru_page_sync(0x1234500000030); +SELECT test_slru_page_exists(0x1234500000030); +-- Segment deletion +SELECT test_slru_page_delete(0x1234500000030); +SELECT test_slru_page_exists(0x1234500000030); +-- Page truncation +SELECT test_slru_page_exists(0x1234500000025); +SELECT test_slru_page_truncate(0x1234500000025); +SELECT test_slru_page_exists(0x1234500000025); + +-- Full deletion +SELECT test_slru_delete_all(); +SELECT test_slru_page_exists(0x1234500000000); +SELECT test_slru_page_exists(0x1234500000025); +SELECT test_slru_page_exists(0x1234500000030); + +DROP EXTENSION test_slru; \ No newline at end of file diff --git a/src/test/modules/test_slru/test_slru--1.0.sql b/src/test/modules/test_slru/test_slru--1.0.sql index 202e8da3fd..3f4d0e9ef1 100644 --- a/src/test/modules/test_slru/test_slru--1.0.sql +++ b/src/test/modules/test_slru/test_slru--1.0.sql @@ -19,3 +19,5 @@ CREATE OR REPLACE FUNCTION test_slru_page_truncate(bigint) RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_page_truncate' LANGUAGE C; CREATE OR REPLACE FUNCTION test_slru_delete_all() RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_delete_all' LANGUAGE C; +CREATE OR REPLACE FUNCTION test_slru_allow_long_names() RETURNS VOID + AS 'MODULE_PATHNAME', 'test_slru_allow_long_names' LANGUAGE C; \ No newline at end of file diff --git a/src/test/modules/test_slru/test_slru.c b/src/test/modules/test_slru/test_slru.c index 337b88fc17..540387637d 100644 --- a/src/test/modules/test_slru/test_slru.c +++ b/src/test/modules/test_slru/test_slru.c @@ -36,6 +36,7 @@ PG_FUNCTION_INFO_V1(test_slru_page_sync); PG_FUNCTION_INFO_V1(test_slru_page_delete); PG_FUNCTION_INFO_V1(test_slru_page_truncate); PG_FUNCTION_INFO_V1(test_slru_delete_all); +PG_FUNCTION_INFO_V1(test_slru_allow_long_names); /* Number of SLRU page slots */ #define NUM_TEST_BUFFERS 16 @@ -179,6 +180,7 @@ test_slru_page_truncate(PG_FUNCTION_ARGS) int64 pageno = PG_GETARG_INT64(0); SimpleLruTruncate(TestSlruCtl, pageno); + PG_RETURN_VOID(); } @@ -191,6 +193,14 @@ test_slru_delete_all(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } +Datum +test_slru_allow_long_names(PG_FUNCTION_ARGS) +{ + TestSlruCtl->long_segment_names = true; + + PG_RETURN_VOID(); +} + /* * Module load callbacks and initialization. */ @@ -232,6 +242,8 @@ test_slru_shmem_startup(void) LWLockInitialize(TestSLRULock, test_tranche_id); TestSlruCtl->PagePrecedes = test_slru_page_precedes_logically; + TestSlruCtl->long_segment_names = false; + SimpleLruInit(TestSlruCtl, "TestSLRU", NUM_TEST_BUFFERS, 0, TestSLRULock, slru_dir_name, test_tranche_id, SYNC_HANDLER_NONE, false); -- 2.42.0