@@ -692,3 +692,106 @@ def test_delete_multiple_descendants(self):
692692
693693 # Clean after yourself
694694 self .del_test_dir (module_name , fname )
695+
696+ # @unittest.skip("skip")
697+ def test_delete_multiple_descendants_dry_run (self ):
698+ """
699+ PAGEa3
700+ PAGEa2 /
701+ \ /
702+ PAGEa1 (delete target)
703+ |
704+ FULLa
705+ """
706+ fname = self .id ().split ('.' )[3 ]
707+ node = self .make_simple_node (
708+ base_dir = os .path .join (module_name , fname , 'node' ),
709+ initdb_params = ['--data-checksums' ])
710+
711+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
712+ self .init_pb (backup_dir )
713+ self .add_instance (backup_dir , 'node' , node )
714+ self .set_archiving (backup_dir , 'node' , node )
715+ node .slow_start ()
716+
717+ # Take FULL BACKUP
718+ node .pgbench_init (scale = 1 )
719+ backup_id_a = self .backup_node (backup_dir , 'node' , node )
720+
721+ pgbench = node .pgbench (options = ['-T' , '10' , '-c' , '2' ])
722+ pgbench .wait ()
723+ page_id_a1 = self .backup_node (
724+ backup_dir , 'node' , node , backup_type = 'page' )
725+
726+ pgbench = node .pgbench (options = ['-T' , '10' , '-c' , '2' ])
727+ pgbench .wait ()
728+ page_id_a2 = self .backup_node (
729+ backup_dir , 'node' , node , backup_type = 'page' )
730+
731+
732+ # Change PAGEa2 to ERROR
733+ self .change_backup_status (backup_dir , 'node' , page_id_a2 , 'ERROR' )
734+
735+ pgbench = node .pgbench (options = ['-T' , '10' , '-c' , '2' ])
736+ pgbench .wait ()
737+ page_id_a3 = self .backup_node (
738+ backup_dir , 'node' , node , backup_type = 'page' )
739+
740+ # Change PAGEa2 to ERROR
741+ self .change_backup_status (backup_dir , 'node' , page_id_a2 , 'OK' )
742+
743+ # Delete PAGEa1
744+ output = self .delete_pb (
745+ backup_dir , 'node' , page_id_a1 ,
746+ options = ['--dry-run' , '--log-level-console=LOG' , '--delete-wal' ])
747+
748+ print (output )
749+ self .assertIn (
750+ 'LOG: Backup {0} can be deleted' .format (page_id_a3 ),
751+ output )
752+ self .assertIn (
753+ 'LOG: Backup {0} can be deleted' .format (page_id_a2 ),
754+ output )
755+ self .assertIn (
756+ 'LOG: Backup {0} can be deleted' .format (page_id_a1 ),
757+ output )
758+
759+ self .assertIn (
760+ 'INFO: Resident data size to free by '
761+ 'delete of backup {0} :' .format (page_id_a1 ),
762+ output )
763+
764+ self .assertIn (
765+ 'On timeline 1 WAL segments between 0000000000000001 '
766+ 'and 0000000000000002 can be removed' ,
767+ output )
768+
769+ self .assertEqual (len (self .show_pb (backup_dir , 'node' )), 4 )
770+
771+ output = self .delete_pb (
772+ backup_dir , 'node' , page_id_a1 ,
773+ options = ['--log-level-console=LOG' , '--delete-wal' ])
774+
775+ self .assertIn (
776+ 'LOG: Backup {0} will be deleted' .format (page_id_a3 ),
777+ output )
778+ self .assertIn (
779+ 'LOG: Backup {0} will be deleted' .format (page_id_a2 ),
780+ output )
781+ self .assertIn (
782+ 'LOG: Backup {0} will be deleted' .format (page_id_a1 ),
783+ output )
784+ self .assertIn (
785+ 'INFO: Resident data size to free by '
786+ 'delete of backup {0} :' .format (page_id_a1 ),
787+ output )
788+
789+ self .assertIn (
790+ 'On timeline 1 WAL segments between 0000000000000001 '
791+ 'and 0000000000000002 will be removed' ,
792+ output )
793+
794+ self .assertEqual (len (self .show_pb (backup_dir , 'node' )), 1 )
795+
796+ # Clean after yourself
797+ self .del_test_dir (module_name , fname )
0 commit comments