Skip to content

Commit 8f32299

Browse files
committed
Detect unused steps in isolation specs and do some cleanup
This is useful for developers to find out if an isolation spec is over-engineered or if it needs more work by warning at the end of a test run if a step is not used, generating a failure with extra diffs. While on it, clean up all the specs which include steps not used in any permutations to simplify them. This is a backpatch of 989d23b and 06fdc4e, as it is becoming useful to make all the branches consistent for an upcoming patch that will improve the output generated by isolationtester. Author: Michael Paquier Reviewed-by: Asim Praveen, Melanie Plageman Discussion: https://postgr.es/m/20190819080820.GG18166@paquier.xyz Discussion: https://postgr.es/m/794820.1623872009@sss.pgh.pa.us Backpatch-through: 9.6
1 parent 834cb72 commit 8f32299

14 files changed

+40
-42
lines changed

contrib/test_decoding/specs/concurrent_ddl_dml.spec

-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ setup { SET synchronous_commit=on; }
1919
step "s1_init" { SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding'); }
2020
step "s1_begin" { BEGIN; }
2121
step "s1_insert_tbl1" { INSERT INTO tbl1 (val1, val2) VALUES (1, 1); }
22-
step "s1_insert_tbl1_3col" { INSERT INTO tbl1 (val1, val2, val3) VALUES (1, 1, 1); }
2322
step "s1_insert_tbl2" { INSERT INTO tbl2 (val1, val2) VALUES (1, 1); }
2423
step "s1_insert_tbl2_3col" { INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1); }
2524
step "s1_commit" { COMMIT; }
@@ -29,15 +28,8 @@ setup { SET synchronous_commit=on; }
2928

3029
step "s2_alter_tbl1_float" { ALTER TABLE tbl1 ALTER COLUMN val2 TYPE float; }
3130
step "s2_alter_tbl1_char" { ALTER TABLE tbl1 ALTER COLUMN val2 TYPE character varying; }
32-
step "s2_alter_tbl1_text" { ALTER TABLE tbl1 ALTER COLUMN val2 TYPE text; }
3331
step "s2_alter_tbl1_boolean" { ALTER TABLE tbl1 ALTER COLUMN val2 TYPE boolean; }
3432

35-
step "s2_alter_tbl1_add_int" { ALTER TABLE tbl1 ADD COLUMN val3 INTEGER; }
36-
step "s2_alter_tbl1_add_float" { ALTER TABLE tbl1 ADD COLUMN val3 FLOAT; }
37-
step "s2_alter_tbl1_add_char" { ALTER TABLE tbl1 ADD COLUMN val3 character varying; }
38-
step "s2_alter_tbl1_add_boolean" { ALTER TABLE tbl1 ADD COLUMN val3 BOOLEAN; }
39-
step "s2_alter_tbl1_add_text" { ALTER TABLE tbl1 ADD COLUMN val3 TEXT; }
40-
4133
step "s2_alter_tbl2_float" { ALTER TABLE tbl2 ALTER COLUMN val2 TYPE float; }
4234
step "s2_alter_tbl2_char" { ALTER TABLE tbl2 ALTER COLUMN val2 TYPE character varying; }
4335
step "s2_alter_tbl2_text" { ALTER TABLE tbl2 ALTER COLUMN val2 TYPE text; }
@@ -46,7 +38,6 @@ step "s2_alter_tbl2_boolean" { ALTER TABLE tbl2 ALTER COLUMN val2 TYPE boolean;
4638
step "s2_alter_tbl2_add_int" { ALTER TABLE tbl2 ADD COLUMN val3 INTEGER; }
4739
step "s2_alter_tbl2_add_float" { ALTER TABLE tbl2 ADD COLUMN val3 FLOAT; }
4840
step "s2_alter_tbl2_add_char" { ALTER TABLE tbl2 ADD COLUMN val3 character varying; }
49-
step "s2_alter_tbl2_add_boolean" { ALTER TABLE tbl2 ADD COLUMN val3 BOOLEAN; }
5041
step "s2_alter_tbl2_add_text" { ALTER TABLE tbl2 ADD COLUMN val3 TEXT; }
5142
step "s2_alter_tbl2_drop_3rd_col" { ALTER TABLE tbl2 DROP COLUMN val3; }
5243
step "s2_alter_tbl2_3rd_char" { ALTER TABLE tbl2 ALTER COLUMN val3 TYPE character varying; }

contrib/test_decoding/specs/snapshot_transfer.spec

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ step "s0_sub_get_base_snap" { INSERT INTO dummy VALUES (0); }
2525
step "s0_insert" { INSERT INTO harvest VALUES (1, 2, 3); }
2626
step "s0_end_sub0" { RELEASE SAVEPOINT s0; }
2727
step "s0_end_sub1" { RELEASE SAVEPOINT s1; }
28-
step "s0_insert2" { INSERT INTO harvest VALUES (1, 2, 3, 4); }
2928
step "s0_commit" { COMMIT; }
3029
step "s0_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); }
3130

src/test/isolation/expected/eval-plan-qual-trigger.out

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Parsed test spec with 4 sessions
1+
Parsed test spec with 3 sessions
22

33
starting permutation: s1_trig_rep_b_u s1_trig_rep_a_u s1_ins_a s1_ins_b s1_b_rc s2_b_rc s1_upd_a_data s1_c s2_upd_a_data s2_c s0_rep
44
step s1_trig_rep_b_u: CREATE TRIGGER rep_b_u BEFORE UPDATE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report();

src/test/isolation/isolationtester.c

+18-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ main(int argc, char **argv)
8888
puts("isolationtester (PostgreSQL) " PG_VERSION);
8989
exit(0);
9090
default:
91-
fprintf(stderr, "Usage: isolationtester [-n] [CONNINFO]\n");
91+
fprintf(stderr, "Usage: isolationtester [CONNINFO]\n");
9292
return EXIT_FAILURE;
9393
}
9494
}
@@ -252,10 +252,23 @@ static int *piles;
252252
static void
253253
run_testspec(TestSpec *testspec)
254254
{
255+
int i;
256+
255257
if (testspec->permutations)
256258
run_named_permutations(testspec);
257259
else
258260
run_all_permutations(testspec);
261+
262+
/*
263+
* Verify that all steps have been used, complaining about anything
264+
* defined but not used.
265+
*/
266+
for (i = 0; i < testspec->nallsteps; i++)
267+
{
268+
if (!testspec->allsteps[i]->used)
269+
fprintf(stderr, "unused step name: %s\n",
270+
testspec->allsteps[i]->name);
271+
}
259272
}
260273

261274
/*
@@ -455,7 +468,11 @@ run_permutation(TestSpec *testspec, int nsteps, Step **steps)
455468

456469
printf("\nstarting permutation:");
457470
for (i = 0; i < nsteps; i++)
471+
{
472+
/* Track the permutation as in-use */
473+
steps[i]->used = true;
458474
printf(" %s", steps[i]->name);
475+
}
459476
printf("\n");
460477

461478
/* Perform setup */

src/test/isolation/isolationtester.h

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct Session
2929
struct Step
3030
{
3131
int session;
32+
bool used;
3233
char *name;
3334
char *sql;
3435
char *errormsg;

src/test/isolation/specparse.y

+1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ step:
145145
$$ = pg_malloc(sizeof(Step));
146146
$$->name = $2;
147147
$$->sql = $3;
148+
$$->used = false;
148149
$$->errormsg = NULL;
149150
}
150151
;

src/test/isolation/specs/eval-plan-qual-trigger.spec

+19-19
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ session "s2"
113113
step "s2_b_rc" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; }
114114
step "s2_b_rr" { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; }
115115
step "s2_c" { COMMIT; }
116-
step "s2_r" { ROLLBACK; }
116+
#step "s2_r" { ROLLBACK; }
117117
step "s2_ins_a" { INSERT INTO trigtest VALUES ('key-a', 'val-a-s2') RETURNING *; }
118118
step "s2_del_a" {
119119
DELETE FROM trigtest
@@ -153,25 +153,25 @@ step "s2_upsert_a_data" {
153153
RETURNING *;
154154
}
155155

156-
session "s3"
156+
#session "s3"
157157
#setup { }
158-
step "s3_b_rc" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; }
159-
step "s3_c" { COMMIT; }
160-
step "s3_r" { ROLLBACK; }
161-
step "s3_del_a" {
162-
DELETE FROM trigtest
163-
WHERE
164-
noisy_oper('upd', key, '=', 'key-a') AND
165-
noisy_oper('upk', data, '<>', 'mismatch')
166-
RETURNING *
167-
}
168-
step "s3_upd_a_data" {
169-
UPDATE trigtest SET data = data || '-ups3'
170-
WHERE
171-
noisy_oper('upd', key, '=', 'key-a') AND
172-
noisy_oper('upk', data, '<>', 'mismatch')
173-
RETURNING *;
174-
}
158+
#step "s3_b_rc" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; }
159+
#step "s3_c" { COMMIT; }
160+
#step "s3_r" { ROLLBACK; }
161+
#step "s3_del_a" {
162+
# DELETE FROM trigtest
163+
# WHERE
164+
# noisy_oper('upd', key, '=', 'key-a') AND
165+
# noisy_oper('upk', data, '<>', 'mismatch')
166+
# RETURNING *
167+
#}
168+
#step "s3_upd_a_data" {
169+
# UPDATE trigtest SET data = data || '-ups3'
170+
# WHERE
171+
# noisy_oper('upd', key, '=', 'key-a') AND
172+
# noisy_oper('upk', data, '<>', 'mismatch')
173+
# RETURNING *;
174+
#}
175175

176176
### base case verifying that triggers see performed modifications
177177
# s1 updates, s1 commits, s2 updates

src/test/isolation/specs/freeze-the-dead.spec

-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ session "s1"
1919
step "s1_begin" { BEGIN; }
2020
step "s1_update" { UPDATE tab_freeze SET x = x + 1 WHERE id = 3; }
2121
step "s1_commit" { COMMIT; }
22-
step "s1_vacuum" { VACUUM FREEZE tab_freeze; }
2322
step "s1_selectone" {
2423
BEGIN;
2524
SET LOCAL enable_seqscan = false;
@@ -28,7 +27,6 @@ step "s1_selectone" {
2827
COMMIT;
2928
}
3029
step "s1_selectall" { SELECT * FROM tab_freeze ORDER BY name, id; }
31-
step "s1_reindex" { REINDEX TABLE tab_freeze; }
3230

3331
session "s2"
3432
step "s2_begin" { BEGIN; }
@@ -40,7 +38,6 @@ session "s3"
4038
step "s3_begin" { BEGIN; }
4139
step "s3_key_share" { SELECT id FROM tab_freeze WHERE id = 3 FOR KEY SHARE; }
4240
step "s3_commit" { COMMIT; }
43-
step "s3_vacuum" { VACUUM FREEZE tab_freeze; }
4441

4542
# This permutation verfies that a previous bug
4643
# https://postgr.es/m/E5711E62-8FDF-4DCA-A888-C200BF6B5742@amazon.com

src/test/isolation/specs/insert-conflict-do-nothing.spec

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ setup
3333
step "donothing2" { INSERT INTO ints(key, val) VALUES(1, 'donothing2') ON CONFLICT DO NOTHING; }
3434
step "select2" { SELECT * FROM ints; }
3535
step "c2" { COMMIT; }
36-
step "a2" { ABORT; }
3736

3837
# Regular case where one session block-waits on another to determine if it
3938
# should proceed with an insert or do nothing.

src/test/isolation/specs/insert-conflict-do-update-2.spec

-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ setup
3232
step "insert2" { INSERT INTO upsert(key, payload) VALUES('FOOFOO', 'insert2') ON CONFLICT (lower(key)) DO UPDATE set key = EXCLUDED.key, payload = upsert.payload || ' updated by insert2'; }
3333
step "select2" { SELECT * FROM upsert; }
3434
step "c2" { COMMIT; }
35-
step "a2" { ABORT; }
3635

3736
# One session (session 2) block-waits on another (session 1) to determine if it
3837
# should proceed with an insert or update. The user can still usefully UPDATE

src/test/isolation/specs/insert-conflict-do-update.spec

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ setup
3030
step "insert2" { INSERT INTO upsert(key, val) VALUES(1, 'insert2') ON CONFLICT (key) DO UPDATE set val = upsert.val || ' updated by insert2'; }
3131
step "select2" { SELECT * FROM upsert; }
3232
step "c2" { COMMIT; }
33-
step "a2" { ABORT; }
3433

3534
# One session (session 2) block-waits on another (session 1) to determine if it
3635
# should proceed with an insert or update. Notably, this entails updating a

src/test/isolation/specs/partition-key-update-1.spec

-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ step "s1r" { ROLLBACK; }
5757

5858
session "s2"
5959
step "s2b" { BEGIN ISOLATION LEVEL READ COMMITTED; }
60-
step "s2u" { UPDATE foo SET b='EFG' WHERE a=1; }
6160
step "s2u2" { UPDATE footrg SET b='XYZ' WHERE a=1; }
6261
step "s2i" { INSERT INTO bar VALUES(7); }
6362
step "s2d" { DELETE FROM foo WHERE a=1; }

src/test/isolation/specs/sequence-ddl.spec

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ setup { BEGIN; }
1515
step "s1alter" { ALTER SEQUENCE seq1 MAXVALUE 10; }
1616
step "s1alter2" { ALTER SEQUENCE seq1 MAXVALUE 20; }
1717
step "s1restart" { ALTER SEQUENCE seq1 RESTART WITH 5; }
18-
step "s1setval" { SELECT setval('seq1', 5); }
1918
step "s1commit" { COMMIT; }
2019

2120
session "s2"

src/test/isolation/specs/tuplelock-upgrade-no-deadlock.spec

-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ teardown
1919
session "s0"
2020
step "s0_begin" { begin; }
2121
step "s0_keyshare" { select id from tlu_job where id = 1 for key share;}
22-
step "s0_share" { select id from tlu_job where id = 1 for share;}
2322
step "s0_rollback" { rollback; }
2423

2524
session "s1"
@@ -28,7 +27,6 @@ step "s1_keyshare" { select id from tlu_job where id = 1 for key share;}
2827
step "s1_share" { select id from tlu_job where id = 1 for share; }
2928
step "s1_fornokeyupd" { select id from tlu_job where id = 1 for no key update; }
3029
step "s1_update" { update tlu_job set name = 'b' where id = 1; }
31-
step "s1_delete" { delete from tlu_job where id = 1; }
3230
step "s1_savept_e" { savepoint s1_e; }
3331
step "s1_savept_f" { savepoint s1_f; }
3432
step "s1_rollback_e" { rollback to s1_e; }
@@ -44,7 +42,6 @@ step "s2_for_update" { select id from tlu_job where id = 1 for update; }
4442
step "s2_update" { update tlu_job set name = 'b' where id = 1; }
4543
step "s2_delete" { delete from tlu_job where id = 1; }
4644
step "s2_rollback" { rollback; }
47-
step "s2_commit" { commit; }
4845

4946
session "s3"
5047
setup { begin; }

0 commit comments

Comments
 (0)