On Thu, Feb 21, 2019 at 9:27 PM Alvaro Herrera <alvhe...@2ndquadrant.com> wrote: > > I think this test is going to break on nonstandard block sizes. While > we don't promise that all tests work on such installs (particularly > planner ones), it seems fairly easy to cope with this one -- just use a > record size expressed as a fraction of current_setting('block_size'). > So instead of "1024" you'd write current_setting('block_size') / 8. > And then display the relation size in terms of pages, not bytes, so > divide pg_relation_size by block size.
I've done this for v6, tested on 16k block size. -- John Naylor https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 157f74155beb53c455b0a85b6eebdd22a60ce5f5 Mon Sep 17 00:00:00 2001 From: John Naylor <jcnay...@gmail.com> Date: Sat, 23 Feb 2019 08:48:31 +0100 Subject: [PATCH v6] Add more tests for FSM. In commit b0eaa4c51bb, we left out a test that used a vacuum to remove dead rows as the behavior of test was not predictable. This test has been rewritten to use fillfactor instead to control free space. Since we no longer need to remove dead rows as part of the test, put the fsm regression test in a parallel group. --- src/test/regress/expected/fsm.out | 59 +++++++++++++++++++++--------- src/test/regress/parallel_schedule | 8 +--- src/test/regress/serial_schedule | 2 +- src/test/regress/sql/fsm.sql | 41 +++++++++++++++++---- 4 files changed, 77 insertions(+), 33 deletions(-) diff --git a/src/test/regress/expected/fsm.out b/src/test/regress/expected/fsm.out index b02993188c..698d4b0be5 100644 --- a/src/test/regress/expected/fsm.out +++ b/src/test/regress/expected/fsm.out @@ -1,15 +1,40 @@ -- -- Free Space Map test -- +SELECT current_setting('block_size')::integer AS blocksize, +current_setting('block_size')::integer / 8 AS strsize +\gset CREATE TABLE fsm_check_size (num int, str text); --- With one block, there should be no FSM -INSERT INTO fsm_check_size VALUES(1, 'a'); +-- Fill 3 blocks with one record each +ALTER TABLE fsm_check_size SET (fillfactor=15); +INSERT INTO fsm_check_size SELECT i, rpad('', :strsize, 'a') +FROM generate_series(1,3) i; +-- There should be no FSM VACUUM fsm_check_size; -SELECT pg_relation_size('fsm_check_size', 'main') AS heap_size, -pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; - heap_size | fsm_size ------------+---------- - 8192 | 0 +SELECT pg_relation_size('fsm_check_size', 'main') / :blocksize AS heap_nblocks, +pg_relation_size('fsm_check_size', 'fsm') / :blocksize AS fsm_nblocks; + heap_nblocks | fsm_nblocks +--------------+------------- + 3 | 0 +(1 row) + +-- The following operations are for testing the functionality of the local +-- in-memory map. In particular, we want to be able to insert into some +-- other block than the one at the end of the heap, without using a FSM. +-- Fill most of the last block +ALTER TABLE fsm_check_size SET (fillfactor=100); +INSERT INTO fsm_check_size SELECT i, rpad('', :strsize, 'a') +FROM generate_series(101,105) i; +-- Make sure records can go into any block but the last one +ALTER TABLE fsm_check_size SET (fillfactor=30); +-- Insert large record and make sure it does not cause the relation to extend +INSERT INTO fsm_check_size VALUES (111, rpad('', :strsize, 'a')); +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'main') / :blocksize AS heap_nblocks, +pg_relation_size('fsm_check_size', 'fsm') / :blocksize AS fsm_nblocks; + heap_nblocks | fsm_nblocks +--------------+------------- + 3 | 0 (1 row) -- Extend table with enough blocks to exceed the FSM threshold @@ -26,23 +51,23 @@ num = 11; END; $$; VACUUM fsm_check_size; -SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; - fsm_size ----------- - 24576 +SELECT pg_relation_size('fsm_check_size', 'fsm') / :blocksize AS fsm_nblocks; + fsm_nblocks +------------- + 3 (1 row) -- Add long random string to extend TOAST table to 1 block INSERT INTO fsm_check_size VALUES(0, (SELECT string_agg(md5(chr(i)), '') - FROM generate_series(1,100) i)); + FROM generate_series(1, :blocksize / 100) i)); VACUUM fsm_check_size; -SELECT pg_relation_size(reltoastrelid, 'main') AS toast_size, -pg_relation_size(reltoastrelid, 'fsm') AS toast_fsm_size +SELECT pg_relation_size(reltoastrelid, 'main') / :blocksize AS toast_nblocks, +pg_relation_size(reltoastrelid, 'fsm') / :blocksize AS toast_fsm_nblocks FROM pg_class WHERE relname = 'fsm_check_size'; - toast_size | toast_fsm_size -------------+---------------- - 8192 | 0 + toast_nblocks | toast_fsm_nblocks +---------------+------------------- + 1 | 0 (1 row) DROP TABLE fsm_check_size; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 4051a4ad4e..a956775dd1 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -23,7 +23,7 @@ test: numerology # ---------- # The second group of parallel tests # ---------- -test: point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 tstypes +test: point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 tstypes fsm # ---------- # Another group of parallel tests @@ -68,12 +68,6 @@ test: create_aggregate create_function_3 create_cast constraints triggers inheri # ---------- test: sanity_check -# ---------- -# fsm does a delete followed by vacuum, and running it in parallel can prevent -# removal of rows. -# ---------- -test: fsm - # ---------- # Believe it or not, select creates a table, subsequent # tests need. diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index ac1ea622d6..51b40f53db 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -40,6 +40,7 @@ test: inet test: macaddr test: macaddr8 test: tstypes +test: fsm test: geometry test: horology test: regex @@ -80,7 +81,6 @@ test: roleattributes test: create_am test: hash_func test: sanity_check -test: fsm test: errors test: select test: select_into diff --git a/src/test/regress/sql/fsm.sql b/src/test/regress/sql/fsm.sql index 332c3e2b2d..7295e0439b 100644 --- a/src/test/regress/sql/fsm.sql +++ b/src/test/regress/sql/fsm.sql @@ -1,15 +1,40 @@ -- -- Free Space Map test -- +SELECT current_setting('block_size')::integer AS blocksize, +current_setting('block_size')::integer / 8 AS strsize +\gset CREATE TABLE fsm_check_size (num int, str text); --- With one block, there should be no FSM -INSERT INTO fsm_check_size VALUES(1, 'a'); +-- Fill 3 blocks with one record each +ALTER TABLE fsm_check_size SET (fillfactor=15); +INSERT INTO fsm_check_size SELECT i, rpad('', :strsize, 'a') +FROM generate_series(1,3) i; +-- There should be no FSM VACUUM fsm_check_size; -SELECT pg_relation_size('fsm_check_size', 'main') AS heap_size, -pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; +SELECT pg_relation_size('fsm_check_size', 'main') / :blocksize AS heap_nblocks, +pg_relation_size('fsm_check_size', 'fsm') / :blocksize AS fsm_nblocks; + +-- The following operations are for testing the functionality of the local +-- in-memory map. In particular, we want to be able to insert into some +-- other block than the one at the end of the heap, without using a FSM. + +-- Fill most of the last block +ALTER TABLE fsm_check_size SET (fillfactor=100); +INSERT INTO fsm_check_size SELECT i, rpad('', :strsize, 'a') +FROM generate_series(101,105) i; + +-- Make sure records can go into any block but the last one +ALTER TABLE fsm_check_size SET (fillfactor=30); + +-- Insert large record and make sure it does not cause the relation to extend +INSERT INTO fsm_check_size VALUES (111, rpad('', :strsize, 'a')); + +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'main') / :blocksize AS heap_nblocks, +pg_relation_size('fsm_check_size', 'fsm') / :blocksize AS fsm_nblocks; -- Extend table with enough blocks to exceed the FSM threshold DO $$ @@ -26,16 +51,16 @@ END; $$; VACUUM fsm_check_size; -SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') / :blocksize AS fsm_nblocks; -- Add long random string to extend TOAST table to 1 block INSERT INTO fsm_check_size VALUES(0, (SELECT string_agg(md5(chr(i)), '') - FROM generate_series(1,100) i)); + FROM generate_series(1, :blocksize / 100) i)); VACUUM fsm_check_size; -SELECT pg_relation_size(reltoastrelid, 'main') AS toast_size, -pg_relation_size(reltoastrelid, 'fsm') AS toast_fsm_size +SELECT pg_relation_size(reltoastrelid, 'main') / :blocksize AS toast_nblocks, +pg_relation_size(reltoastrelid, 'fsm') / :blocksize AS toast_fsm_nblocks FROM pg_class WHERE relname = 'fsm_check_size'; DROP TABLE fsm_check_size; -- 2.17.1