@@ -1212,6 +1212,15 @@ def test_multi_timeline_page(self):
1212
1212
1213
1213
node .safe_psql ("postgres" , "create extension pageinspect" )
1214
1214
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
+
1215
1224
node .pgbench_init (scale = 20 )
1216
1225
full_id = self .backup_node (backup_dir , 'node' , node )
1217
1226
@@ -1233,16 +1242,18 @@ def test_multi_timeline_page(self):
1233
1242
pgbench .wait ()
1234
1243
1235
1244
# create timelines
1236
- for i in range (2 , 6 ):
1245
+ for i in range (2 , 7 ):
1237
1246
node .cleanup ()
1238
1247
self .restore_node (
1239
- backup_dir , 'node' , node , backup_id = full_id ,
1248
+ backup_dir , 'node' , node ,
1240
1249
options = ['--recovery-target-timeline={0}' .format (i )])
1241
1250
node .slow_start ()
1242
- node .safe_psql ("postgres" , "CHECKPOINT" )
1251
+
1252
+ # at this point there is i+1 timeline
1243
1253
pgbench = node .pgbench (options = ['-T' , '10' , '-c' , '1' , '--no-vacuum' ])
1244
1254
pgbench .wait ()
1245
1255
1256
+ # create backup at 2, 4 and 6 timeline
1246
1257
if i % 2 == 0 :
1247
1258
self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
1248
1259
@@ -1252,8 +1263,8 @@ def test_multi_timeline_page(self):
1252
1263
1253
1264
pgdata = self .pgdata_content (node .data_dir )
1254
1265
1255
- # result = node.safe_psql(
1256
- # "postgres", "select * from pgbench_accounts")
1266
+ result = node .safe_psql (
1267
+ "postgres" , "select * from pgbench_accounts" )
1257
1268
1258
1269
node_restored = self .make_simple_node (
1259
1270
base_dir = os .path .join (module_name , fname , 'node_restored' ))
@@ -1265,21 +1276,125 @@ def test_multi_timeline_page(self):
1265
1276
self .set_auto_conf (node_restored , {'port' : node_restored .port })
1266
1277
node_restored .slow_start ()
1267
1278
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" )
1270
1281
1271
- # self.assertEqual(result, result_new)
1282
+ self .assertEqual (result , result_new )
1272
1283
1273
1284
self .compare_pgdata (pgdata , pgdata_restored )
1274
1285
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 )])
1276
1292
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' )
1278
1301
1279
- # self.assertEqual()
1280
1302
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 )
1283
1398
1284
1399
# Clean after yourself
1285
1400
self .del_test_dir (module_name , fname )
0 commit comments