@@ -1212,6 +1212,15 @@ def test_multi_timeline_page(self):
12121212
12131213 node .safe_psql ("postgres" , "create extension pageinspect" )
12141214
1215+ try :
1216+ node .safe_psql (
1217+ "postgres" ,
1218+ "create extension amcheck" )
1219+ except QueryException as e :
1220+ node .safe_psql (
1221+ "postgres" ,
1222+ "create extension amcheck_next" )
1223+
12151224 node .pgbench_init (scale = 20 )
12161225 full_id = self .backup_node (backup_dir , 'node' , node )
12171226
@@ -1233,16 +1242,18 @@ def test_multi_timeline_page(self):
12331242 pgbench .wait ()
12341243
12351244 # create timelines
1236- for i in range (2 , 6 ):
1245+ for i in range (2 , 7 ):
12371246 node .cleanup ()
12381247 self .restore_node (
1239- backup_dir , 'node' , node , backup_id = full_id ,
1248+ backup_dir , 'node' , node ,
12401249 options = ['--recovery-target-timeline={0}' .format (i )])
12411250 node .slow_start ()
1242- node .safe_psql ("postgres" , "CHECKPOINT" )
1251+
1252+ # at this point there is i+1 timeline
12431253 pgbench = node .pgbench (options = ['-T' , '10' , '-c' , '1' , '--no-vacuum' ])
12441254 pgbench .wait ()
12451255
1256+ # create backup at 2, 4 and 6 timeline
12461257 if i % 2 == 0 :
12471258 self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
12481259
@@ -1252,8 +1263,8 @@ def test_multi_timeline_page(self):
12521263
12531264 pgdata = self .pgdata_content (node .data_dir )
12541265
1255- # result = node.safe_psql(
1256- # "postgres", "select * from pgbench_accounts")
1266+ result = node .safe_psql (
1267+ "postgres" , "select * from pgbench_accounts" )
12571268
12581269 node_restored = self .make_simple_node (
12591270 base_dir = os .path .join (module_name , fname , 'node_restored' ))
@@ -1265,21 +1276,125 @@ def test_multi_timeline_page(self):
12651276 self .set_auto_conf (node_restored , {'port' : node_restored .port })
12661277 node_restored .slow_start ()
12671278
1268- # result_new = node_restored.safe_psql(
1269- # "postgres", "select * from pgbench_accounts")
1279+ result_new = node_restored .safe_psql (
1280+ "postgres" , "select * from pgbench_accounts" )
12701281
1271- # self.assertEqual(result, result_new)
1282+ self .assertEqual (result , result_new )
12721283
12731284 self .compare_pgdata (pgdata , pgdata_restored )
12741285
1275- show = self .show_archive (backup_dir )
1286+ self .checkdb_node (
1287+ backup_dir ,
1288+ 'node' ,
1289+ options = [
1290+ '--amcheck' ,
1291+ '-d' , 'postgres' , '-p' , str (node .port )])
12761292
1277- timelines = show [0 ]['timelines' ]
1293+ self .checkdb_node (
1294+ backup_dir ,
1295+ 'node' ,
1296+ options = [
1297+ '--amcheck' ,
1298+ '-d' , 'postgres' , '-p' , str (node_restored .port )])
1299+
1300+ backup_list = self .show_pb (backup_dir , 'node' )
12781301
1279- # self.assertEqual()
12801302 self .assertEqual (
1281- self .show_pb (backup_dir , 'node' , page_id )['parent-backup-id' ],
1282- full_id )
1303+ backup_list [2 ]['parent-backup-id' ],
1304+ backup_list [0 ]['id' ])
1305+
1306+ self .assertEqual (
1307+ backup_list [3 ]['parent-backup-id' ],
1308+ backup_list [2 ]['id' ])
1309+
1310+ self .assertEqual (
1311+ backup_list [4 ]['parent-backup-id' ],
1312+ backup_list [3 ]['id' ])
1313+
1314+ self .assertEqual (
1315+ backup_list [5 ]['parent-backup-id' ],
1316+ backup_list [4 ]['id' ])
1317+
1318+ # Clean after yourself
1319+ self .del_test_dir (module_name , fname )
1320+
1321+ # @unittest.skip("skip")
1322+ # @unittest.expectedFailure
1323+ def test_multitimeline_page_1 (self ):
1324+ """
1325+ Check that backup in PAGE mode choose
1326+ parent backup correctly:
1327+ t2 /---->
1328+ t1 -F--P---D->
1329+
1330+ P must have F as parent
1331+ """
1332+ fname = self .id ().split ('.' )[3 ]
1333+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
1334+ node = self .make_simple_node (
1335+ base_dir = os .path .join (module_name , fname , 'node' ),
1336+ set_replication = True ,
1337+ initdb_params = ['--data-checksums' ],
1338+ pg_options = {'autovacuum' : 'off' , 'wal_log_hints' : 'on' })
1339+
1340+ self .init_pb (backup_dir )
1341+ self .add_instance (backup_dir , 'node' , node )
1342+ self .set_archiving (backup_dir , 'node' , node )
1343+ node .slow_start ()
1344+
1345+ node .safe_psql ("postgres" , "create extension pageinspect" )
1346+
1347+ try :
1348+ node .safe_psql (
1349+ "postgres" ,
1350+ "create extension amcheck" )
1351+ except QueryException as e :
1352+ node .safe_psql (
1353+ "postgres" ,
1354+ "create extension amcheck_next" )
1355+
1356+ node .pgbench_init (scale = 20 )
1357+ full_id = self .backup_node (backup_dir , 'node' , node )
1358+
1359+ pgbench = node .pgbench (options = ['-T' , '20' , '-c' , '1' ])
1360+ pgbench .wait ()
1361+
1362+ page1 = self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
1363+
1364+ pgbench = node .pgbench (options = ['-T' , '10' , '-c' , '1' , '--no-vacuum' ])
1365+ pgbench .wait ()
1366+
1367+ page1 = self .backup_node (backup_dir , 'node' , node , backup_type = 'delta' )
1368+
1369+ node .cleanup ()
1370+ self .restore_node (
1371+ backup_dir , 'node' , node , backup_id = page1 ,
1372+ options = [
1373+ '--recovery-target=immediate' ,
1374+ '--recovery-target-action=promote' ])
1375+
1376+ node .slow_start ()
1377+
1378+ pgbench = node .pgbench (options = ['-T' , '20' , '-c' , '1' , '--no-vacuum' ])
1379+ pgbench .wait ()
1380+
1381+ print (self .backup_node (
1382+ backup_dir , 'node' , node , backup_type = 'page' ,
1383+ options = ['--log-level-console=LOG' ], return_id = False ))
1384+
1385+ pgdata = self .pgdata_content (node .data_dir )
1386+
1387+ node_restored = self .make_simple_node (
1388+ base_dir = os .path .join (module_name , fname , 'node_restored' ))
1389+ node_restored .cleanup ()
1390+
1391+ self .restore_node (backup_dir , 'node' , node_restored )
1392+ pgdata_restored = self .pgdata_content (node_restored .data_dir )
1393+
1394+ self .set_auto_conf (node_restored , {'port' : node_restored .port })
1395+ node_restored .slow_start ()
1396+
1397+ self .compare_pgdata (pgdata , pgdata_restored )
12831398
12841399 # Clean after yourself
12851400 self .del_test_dir (module_name , fname )
0 commit comments