@@ -983,6 +983,90 @@ def test_basic_master_and_replica_concurrent_archiving(self):
983983 # Clean after yourself
984984 self .del_test_dir (module_name , fname )
985985
986+
987+ # @unittest.expectedFailure
988+ # @unittest.skip("skip")
989+ def test_concurrent_archiving (self ):
990+ """
991+ Concurrent archiving from master, replica and cascade replica
992+ https://github.com/postgrespro/pg_probackup/issues/327
993+
994+ For PG >= 11 it is expected to pass this test
995+ """
996+
997+ if self .pg_config_version < self .version_to_num ('11.0' ):
998+ return unittest .skip ('You need PostgreSQL >= 11 for this test' )
999+
1000+ fname = self .id ().split ('.' )[3 ]
1001+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
1002+ master = self .make_simple_node (
1003+ base_dir = os .path .join (module_name , fname , 'master' ),
1004+ set_replication = True ,
1005+ initdb_params = ['--data-checksums' ],
1006+ pg_options = {'autovacuum' : 'off' })
1007+
1008+ self .init_pb (backup_dir )
1009+ self .add_instance (backup_dir , 'node' , master )
1010+ self .set_archiving (backup_dir , 'node' , master , replica = True )
1011+ master .slow_start ()
1012+
1013+ master .pgbench_init (scale = 10 )
1014+
1015+ # TAKE FULL ARCHIVE BACKUP FROM MASTER
1016+ self .backup_node (backup_dir , 'node' , master )
1017+
1018+ # Settings for Replica
1019+ replica = self .make_simple_node (
1020+ base_dir = os .path .join (module_name , fname , 'replica' ))
1021+ replica .cleanup ()
1022+ self .restore_node (backup_dir , 'node' , replica )
1023+
1024+ self .set_replica (master , replica , synchronous = True )
1025+ self .set_archiving (backup_dir , 'node' , replica , replica = True )
1026+ self .set_auto_conf (replica , {'port' : replica .port })
1027+ replica .slow_start (replica = True )
1028+
1029+ # create cascade replicas
1030+ replica1 = self .make_simple_node (
1031+ base_dir = os .path .join (module_name , fname , 'replica1' ))
1032+ replica1 .cleanup ()
1033+
1034+ # Settings for casaced replica
1035+ self .restore_node (backup_dir , 'node' , replica1 )
1036+ self .set_replica (replica , replica1 , synchronous = False )
1037+ self .set_auto_conf (replica1 , {'port' : replica1 .port })
1038+ replica1 .slow_start (replica = True )
1039+
1040+ # Take full backup from master
1041+ self .backup_node (backup_dir , 'node' , master )
1042+
1043+ pgbench = master .pgbench (
1044+ stdout = subprocess .PIPE , stderr = subprocess .STDOUT ,
1045+ options = ['-T' , '30' , '-c' , '1' ])
1046+
1047+ # Take several incremental backups from master
1048+ self .backup_node (backup_dir , 'node' , master , backup_type = 'page' , options = ['--no-validate' ])
1049+
1050+ self .backup_node (backup_dir , 'node' , master , backup_type = 'page' , options = ['--no-validate' ])
1051+
1052+ pgbench .wait ()
1053+ pgbench .stdout .close ()
1054+
1055+ with open (os .path .join (master .logs_dir , 'postgresql.log' ), 'r' ) as f :
1056+ log_content = f .read ()
1057+ self .assertNotIn ('different checksum' , log_content )
1058+
1059+ with open (os .path .join (replica .logs_dir , 'postgresql.log' ), 'r' ) as f :
1060+ log_content = f .read ()
1061+ self .assertNotIn ('different checksum' , log_content )
1062+
1063+ with open (os .path .join (replica1 .logs_dir , 'postgresql.log' ), 'r' ) as f :
1064+ log_content = f .read ()
1065+ self .assertNotIn ('different checksum' , log_content )
1066+
1067+ # Clean after yourself
1068+ self .del_test_dir (module_name , fname )
1069+
9861070 # @unittest.expectedFailure
9871071 # @unittest.skip("skip")
9881072 def test_archive_pg_receivexlog (self ):
0 commit comments