@@ -2308,17 +2308,81 @@ def test_smart_merge(self):
2308
2308
# Clean after yourself
2309
2309
self .del_test_dir (module_name , fname )
2310
2310
2311
+ def test_idempotent_merge (self ):
2312
+ """
2313
+ """
2314
+ fname = self .id ().split ('.' )[3 ]
2315
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
2316
+ node = self .make_simple_node (
2317
+ base_dir = os .path .join (module_name , fname , 'node' ),
2318
+ set_replication = True ,
2319
+ initdb_params = ['--data-checksums' ],
2320
+ pg_options = {'autovacuum' : 'off' })
2321
+
2322
+ self .init_pb (backup_dir )
2323
+ self .add_instance (backup_dir , 'node' , node )
2324
+ self .set_archiving (backup_dir , 'node' , node )
2325
+ node .slow_start ()
2326
+
2327
+ # add database
2328
+ node .safe_psql (
2329
+ 'postgres' ,
2330
+ 'CREATE DATABASE testdb' )
2331
+
2332
+ # take FULL backup
2333
+ full_id = self .backup_node (
2334
+ backup_dir , 'node' , node , options = ['--stream' ])
2335
+
2336
+ # create database
2337
+ node .safe_psql (
2338
+ 'postgres' ,
2339
+ 'create DATABASE testdb1' )
2340
+
2341
+ # take PAGE backup
2342
+ page_id = self .backup_node (
2343
+ backup_dir , 'node' , node , backup_type = 'page' )
2344
+
2345
+ # create database
2346
+ node .safe_psql (
2347
+ 'postgres' ,
2348
+ 'create DATABASE testdb2' )
2349
+
2350
+ page_id_2 = self .backup_node (
2351
+ backup_dir , 'node' , node , backup_type = 'page' )
2352
+
2353
+ gdb = self .merge_backup (
2354
+ backup_dir , 'node' , page_id_2 ,
2355
+ gdb = True , options = ['--log-level-console=verbose' ])
2356
+
2357
+ gdb .set_breakpoint ('delete_backup_files' )
2358
+ gdb .run_until_break ()
2359
+ gdb .remove_all_breakpoints ()
2360
+
2361
+ gdb .set_breakpoint ('rename' )
2362
+ gdb .continue_execution_until_break ()
2363
+ gdb .continue_execution_until_break (2 )
2364
+
2365
+ gdb ._execute ('signal SIGKILL' )
2366
+
2367
+ show_backups = self .show_pb (backup_dir , "node" )
2368
+ self .assertEqual (len (show_backups ), 1 )
2369
+
2370
+ self .assertEqual (
2371
+ 'MERGED' , self .show_pb (backup_dir , 'node' )[0 ]['status' ])
2372
+
2373
+ self .assertEqual (
2374
+ full_id , self .show_pb (backup_dir , 'node' )[0 ]['id' ])
2375
+
2376
+ self .merge_backup (backup_dir , 'node' , page_id_2 )
2377
+
2378
+ self .assertEqual (
2379
+ 'OK' , self .show_pb (backup_dir , 'node' )[0 ]['status' ])
2311
2380
2312
- # 1. always use parent link when merging (intermediates may be from different chain)
2313
- # 2. page backup we are merging with may disappear after failed merge,
2314
- # it should not be possible to continue merge after that
2315
- # PAGE_A MERGING (disappear)
2316
- # FULL MERGING
2381
+ self .assertEqual (
2382
+ page_id_2 , self .show_pb (backup_dir , 'node' )[0 ]['id' ])
2317
2383
2318
- # FULL MERGING
2319
2384
2320
- # PAGE_B OK (new backup)
2321
- # FULL MERGING
2385
+ self .del_test_dir (module_name , fname )
2322
2386
2323
- # 3 . Need new test with corrupted FULL backup
2324
- # 4 . different compression levels
2387
+ # 1 . Need new test with corrupted FULL backup
2388
+ # 2 . different compression levels
0 commit comments