mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-28 11:55:03 +03:00 
			
		
		
		
	Author: Alexander Lakhin Discussion: https://postgr.es/m/f7e514cf-2446-21f1-a5d2-8c089a6e2168@gmail.com
		
			
				
	
	
		
			47 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # Test that a slot creation skips to restore serialized snapshot to reach
 | |
| # the consistent state.
 | |
| 
 | |
| setup
 | |
| {
 | |
|     DROP TABLE IF EXISTS tbl;
 | |
|     CREATE TABLE tbl (val1 integer);
 | |
| }
 | |
| 
 | |
| teardown
 | |
| {
 | |
|     DROP TABLE tbl;
 | |
|     SELECT 'stop' FROM pg_drop_replication_slot('slot0');
 | |
|     SELECT 'stop' FROM pg_drop_replication_slot('slot1');
 | |
| }
 | |
| 
 | |
| session "s0"
 | |
| setup { SET synchronous_commit = on; }
 | |
| step "s0_init" { SELECT 'init' FROM pg_create_logical_replication_slot('slot0', 'test_decoding'); }
 | |
| step "s0_begin" { BEGIN; }
 | |
| step "s0_insert1" { INSERT INTO tbl VALUES (1); }
 | |
| step "s0_insert2" { INSERT INTO tbl VALUES (2); }
 | |
| step "s0_commit" { COMMIT; }
 | |
| 
 | |
| session "s1"
 | |
| setup { SET synchronous_commit = on; }
 | |
| step "s1_init" { SELECT 'init' FROM pg_create_logical_replication_slot('slot1', 'test_decoding'); }
 | |
| step "s1_get_changes_slot0" { SELECT data FROM pg_logical_slot_get_changes('slot0', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); }
 | |
| step "s1_get_changes_slot1" { SELECT data FROM pg_logical_slot_get_changes('slot1', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); }
 | |
| 
 | |
| session "s2"
 | |
| setup { SET synchronous_commit = on ;}
 | |
| step "s2_checkpoint" { CHECKPOINT; }
 | |
| step "s2_get_changes_slot0" { SELECT data FROM pg_logical_slot_get_changes('slot0', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); }
 | |
| 
 | |
| 
 | |
| # While 'slot1' creation by "s1_init" waits for s0-transaction to commit, the
 | |
| # RUNNING_XACTS record is written by "s2_checkpoint" and "s2_get_changes_slot1"
 | |
| # serializes consistent snapshots to the disk at LSNs where are before
 | |
| # s0-transaction's commit. After s0-transaction commits, "s1_init" resumes but
 | |
| # must not restore any serialized snapshots and will reach the consistent state
 | |
| # when decoding a RUNNING_XACTS record generated after s0-transaction's commit.
 | |
| # We check if the get_changes on 'slot1' will not return any s0-transaction's
 | |
| # changes as its confirmed_flush_lsn will be after the s0-transaction's commit
 | |
| # record.
 | |
| permutation "s0_init" "s0_begin" "s0_insert1" "s1_init" "s2_checkpoint" "s2_get_changes_slot0" "s0_insert2" "s0_commit" "s1_get_changes_slot0" "s1_get_changes_slot1"
 |