mirror of https://github.com/citusdata/citus.git
173 lines
4.1 KiB
Plaintext
173 lines
4.1 KiB
Plaintext
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;
|