@@ -1732,11 +1732,12 @@ def test_restore_backup_from_future(self):
17321732self .backup_node (backup_dir ,'node' ,node )
17331733
17341734node .pgbench_init (scale = 3 )
1735- #pgbench = node.pgbench(options=['-T', '20', '-c', '2'])
1736- #pgbench.wait()
1735+ # pgbench = node.pgbench(options=['-T', '20', '-c', '2'])
1736+ # pgbench.wait()
17371737
17381738# Take PAGE from future
1739- backup_id = self .backup_node (backup_dir ,'node' ,node ,backup_type = 'page' )
1739+ backup_id = self .backup_node (
1740+ backup_dir ,'node' ,node ,backup_type = 'page' )
17401741
17411742with open (
17421743os .path .join (
@@ -1755,7 +1756,8 @@ def test_restore_backup_from_future(self):
17551756pgbench = node .pgbench (options = ['-T' ,'3' ,'-c' ,'2' ,'--no-vacuum' ])
17561757pgbench .wait ()
17571758
1758- backup_id = self .backup_node (backup_dir ,'node' ,node ,backup_type = 'page' )
1759+ backup_id = self .backup_node (
1760+ backup_dir ,'node' ,node ,backup_type = 'page' )
17591761pgdata = self .pgdata_content (node .data_dir )
17601762
17611763node .cleanup ()
@@ -1964,7 +1966,8 @@ def test_restore_target_new_options(self):
19641966
19651967target_time = datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )
19661968with node .connect ("postgres" )as con :
1967- res = con .execute ("INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin)" )
1969+ res = con .execute (
1970+ "INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin)" )
19681971con .commit ()
19691972target_xid = res [0 ][0 ]
19701973
@@ -2101,3 +2104,70 @@ def test_restore_target_new_options(self):
21012104
21022105# Clean after yourself
21032106self .del_test_dir (module_name ,fname )
2107+
2108+ # @unittest.skip("skip")
2109+ def test_smart_restore (self ):
2110+ """
2111+ make node, create database, take full backup, drop database,
2112+ take incremental backup and restore it,
2113+ make sure that files from dropped database are not
2114+ copied during restore
2115+ https://github.com/postgrespro/pg_probackup/issues/63
2116+ """
2117+ fname = self .id ().split ('.' )[3 ]
2118+ node = self .make_simple_node (
2119+ base_dir = os .path .join (module_name ,fname ,'node' ),
2120+ set_replication = True ,
2121+ initdb_params = ['--data-checksums' ])
2122+
2123+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
2124+ self .init_pb (backup_dir )
2125+ self .add_instance (backup_dir ,'node' ,node )
2126+ self .set_archiving (backup_dir ,'node' ,node )
2127+ node .slow_start ()
2128+
2129+ # create database
2130+ node .safe_psql (
2131+ "postgres" ,
2132+ "CREATE DATABASE testdb" )
2133+
2134+ # take FULL backup
2135+ full_id = self .backup_node (backup_dir ,'node' ,node )
2136+
2137+ # drop database
2138+ node .safe_psql (
2139+ "postgres" ,
2140+ "DROP DATABASE testdb" )
2141+
2142+ # take PAGE backup
2143+ page_id = self .backup_node (
2144+ backup_dir ,'node' ,node ,backup_type = 'page' )
2145+
2146+ # restore PAGE backup
2147+ node .cleanup ()
2148+ self .restore_node (
2149+ backup_dir ,'node' ,node ,backup_id = page_id ,
2150+ options = ['--no-validate' ,'--log-level-file=VERBOSE' ])
2151+
2152+ logfile = os .path .join (backup_dir ,'log' ,'pg_probackup.log' )
2153+ with open (logfile ,'r' )as f :
2154+ logfile_content = f .read ()
2155+
2156+ # get delta between FULL and PAGE filelists
2157+ filelist_full = self .get_backup_filelist (
2158+ backup_dir ,'node' ,full_id )
2159+
2160+ filelist_page = self .get_backup_filelist (
2161+ backup_dir ,'node' ,page_id )
2162+
2163+ filelist_diff = self .get_backup_filelist_diff (
2164+ filelist_full ,filelist_page )
2165+
2166+ for file in filelist_diff :
2167+ self .assertNotIn (file ,logfile_content )
2168+
2169+ # Clean after yourself
2170+ self .del_test_dir (module_name ,fname )
2171+
2172+
2173+ # smart restore of external dirs