ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 1220000; -- Tests for prepared transaction recovery -- Ensure pg_dist_transaction is empty for test SELECT recover_prepared_transactions(); recover_prepared_transactions ------------------------------- 0 (1 row) SELECT * FROM pg_dist_transaction; groupid | gid ---------+----- (0 rows) -- Create some "fake" prepared transactions to recover \c - - - :worker_1_port BEGIN; CREATE TABLE should_abort (value int); PREPARE TRANSACTION 'citus_0_should_abort'; BEGIN; CREATE TABLE should_commit (value int); PREPARE TRANSACTION 'citus_0_should_commit'; BEGIN; CREATE TABLE should_be_sorted_into_middle (value int); PREPARE TRANSACTION 'citus_0_should_be_sorted_into_middle'; \c - - - :master_port -- Add "fake" pg_dist_transaction records and run recovery INSERT INTO pg_dist_transaction VALUES (1, 'citus_0_should_commit'); INSERT INTO pg_dist_transaction VALUES (1, 'citus_0_should_be_forgotten'); SELECT recover_prepared_transactions(); NOTICE: recovered a prepared transaction on localhost:57637 CONTEXT: ROLLBACK PREPARED 'citus_0_should_abort' NOTICE: recovered a prepared transaction on localhost:57637 CONTEXT: ROLLBACK PREPARED 'citus_0_should_be_sorted_into_middle' NOTICE: recovered a prepared transaction on localhost:57637 CONTEXT: COMMIT PREPARED 'citus_0_should_commit' recover_prepared_transactions ------------------------------- 3 (1 row) SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) -- Confirm that transactions were correctly rolled forward \c - - - :worker_1_port SELECT count(*) FROM pg_tables WHERE tablename = 'should_abort'; count ------- 0 (1 row) SELECT count(*) FROM pg_tables WHERE tablename = 'should_commit'; count ------- 1 (1 row) \c - - - :master_port SET citus.shard_replication_factor TO 2; SET citus.shard_count TO 2; SET citus.multi_shard_commit_protocol TO '2pc'; CREATE TABLE test_recovery (x text); SELECT create_distributed_table('test_recovery', 'x'); create_distributed_table -------------------------- (1 row) INSERT INTO test_recovery VALUES ('hello'); -- Committed DDL commands should write 4 transaction recovery records BEGIN; ALTER TABLE test_recovery ADD COLUMN y text; ROLLBACK; SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) ALTER TABLE test_recovery ADD COLUMN y text; SELECT count(*) FROM pg_dist_transaction; count ------- 4 (1 row) SELECT recover_prepared_transactions(); recover_prepared_transactions ------------------------------- 0 (1 row) SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) -- Committed master_modify_multiple_shards should write 4 transaction recovery records BEGIN; SELECT master_modify_multiple_shards($$UPDATE test_recovery SET y = 'world'$$); master_modify_multiple_shards ------------------------------- 1 (1 row) ROLLBACK; SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) SELECT master_modify_multiple_shards($$UPDATE test_recovery SET y = 'world'$$); master_modify_multiple_shards ------------------------------- 1 (1 row) SELECT count(*) FROM pg_dist_transaction; count ------- 4 (1 row) SELECT recover_prepared_transactions(); recover_prepared_transactions ------------------------------- 0 (1 row) SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) -- Committed INSERT..SELECT should write 4 transaction recovery records BEGIN; INSERT INTO test_recovery SELECT x, 'earth' FROM test_recovery; ROLLBACK; SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) INSERT INTO test_recovery SELECT x, 'earth' FROM test_recovery; SELECT count(*) FROM pg_dist_transaction; count ------- 4 (1 row) SELECT recover_prepared_transactions(); recover_prepared_transactions ------------------------------- 0 (1 row) SELECT count(*) FROM pg_dist_transaction; count ------- 0 (1 row) \c - - - :master_port DROP TABLE test_recovery;