From 672e3ec0e93e3d2d5549b95f73b2a3ab58714146 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 13 Aug 2015 14:41:52 -0300 Subject: [PATCH] Re-add BRIN isolation test This time, instead of using a core isolation test, put it on its own test module; this way it can require the pageinspect module to be present before running. The module's Makefile is loosely modeled after test_decoding's, so that it's easy to add further tests for either pg_regress or isolationtester later. Backpatch to 9.5. --- src/test/modules/Makefile | 1 + src/test/modules/brin/.gitignore | 3 ++ src/test/modules/brin/Makefile | 30 +++++++++++++ ...summarization-and-inprogress-insertion.out | 39 ++++++++++++++++ ...ummarization-and-inprogress-insertion.spec | 44 +++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 src/test/modules/brin/.gitignore create mode 100644 src/test/modules/brin/Makefile create mode 100644 src/test/modules/brin/expected/summarization-and-inprogress-insertion.out create mode 100644 src/test/modules/brin/specs/summarization-and-inprogress-insertion.spec diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile index 8213e235f7..9b96654279 100644 --- a/src/test/modules/Makefile +++ b/src/test/modules/Makefile @@ -5,6 +5,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global SUBDIRS = \ + brin \ commit_ts \ dummy_seclabel \ test_ddl_deparse \ diff --git a/src/test/modules/brin/.gitignore b/src/test/modules/brin/.gitignore new file mode 100644 index 0000000000..62bbe8f6b1 --- /dev/null +++ b/src/test/modules/brin/.gitignore @@ -0,0 +1,3 @@ +# Generated subdirectories +/isolation_output/ +/tmp_check/ diff --git a/src/test/modules/brin/Makefile b/src/test/modules/brin/Makefile new file mode 100644 index 0000000000..e785471e19 --- /dev/null +++ b/src/test/modules/brin/Makefile @@ -0,0 +1,30 @@ +# src/test/modules/brin/Makefile + +EXTRA_CLEAN = ./isolation_output +EXTRA_INSTALL=contrib/pageinspect + +ISOLATIONCHECKS=summarization-and-inprogress-insertion + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/brin +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif + +check: isolation-check + +isolation-check: | submake-isolation + $(MKDIR_P) isolation_output + $(pg_isolation_regress_check) \ + --outputdir=./isolation_output \ + $(ISOLATIONCHECKS) + +PHONY: check isolation-check + +submake-isolation: + $(MAKE) -C $(top_builddir)/src/test/isolation all diff --git a/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out b/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out new file mode 100644 index 0000000000..ddb90f4dba --- /dev/null +++ b/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out @@ -0,0 +1,39 @@ +Parsed test spec with 2 sessions + +starting permutation: s2check s1b s2b s1i s2summ s1c s2c s2check +step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); +itemoffset blknum attnum allnulls hasnulls placeholder value + +1 0 1 f f f {1 .. 1} +step s1b: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s2b: BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; +?column? + +1 +step s1i: INSERT INTO brin_iso VALUES (1000); +step s2summ: SELECT brin_summarize_new_values('brinidx'::regclass); +brin_summarize_new_values + +1 +step s1c: COMMIT; +step s2c: COMMIT; +step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); +itemoffset blknum attnum allnulls hasnulls placeholder value + +1 0 1 f f f {1 .. 1} +2 1 1 f f f {1 .. 1000} + +starting permutation: s2check s1b s1i s2vacuum s1c s2check +step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); +itemoffset blknum attnum allnulls hasnulls placeholder value + +1 0 1 f f f {1 .. 1} +step s1b: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1i: INSERT INTO brin_iso VALUES (1000); +step s2vacuum: VACUUM brin_iso; +step s1c: COMMIT; +step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); +itemoffset blknum attnum allnulls hasnulls placeholder value + +1 0 1 f f f {1 .. 1} +2 1 1 f f f {1 .. 1000} diff --git a/src/test/modules/brin/specs/summarization-and-inprogress-insertion.spec b/src/test/modules/brin/specs/summarization-and-inprogress-insertion.spec new file mode 100644 index 0000000000..19ac18a2e8 --- /dev/null +++ b/src/test/modules/brin/specs/summarization-and-inprogress-insertion.spec @@ -0,0 +1,44 @@ +# This test verifies that values inserted in transactions still in progress +# are considered during concurrent range summarization (either using the +# brin_summarize_new_values function or regular VACUUM). + +setup +{ + CREATE TABLE brin_iso ( + value int + ) WITH (fillfactor=10); + CREATE INDEX brinidx ON brin_iso USING brin (value) WITH (pages_per_range=1); + -- this fills the first page + DO $$ + DECLARE curtid tid; + BEGIN + LOOP + INSERT INTO brin_iso VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(1, 0)'; + END LOOP; + END; + $$; + CREATE EXTENSION IF NOT EXISTS pageinspect; +} + +teardown +{ + DROP TABLE brin_iso; +} + +session "s1" +step "s1b" { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step "s1i" { INSERT INTO brin_iso VALUES (1000); } +step "s1c" { COMMIT; } + +session "s2" +step "s2b" { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; } +step "s2summ" { SELECT brin_summarize_new_values('brinidx'::regclass); } +step "s2c" { COMMIT; } + +step "s2vacuum" { VACUUM brin_iso; } + +step "s2check" { SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); } + +permutation "s2check" "s1b" "s2b" "s1i" "s2summ" "s1c" "s2c" "s2check" +permutation "s2check" "s1b" "s1i" "s2vacuum" "s1c" "s2check"