@@ -305,3 +305,95 @@ def test_locking_running_3(self):
305
305
306
306
# Clean after yourself
307
307
self .del_test_dir (module_name , fname )
308
+
309
+ def test_locking_restore_locked (self ):
310
+ """
311
+ make node, take full backup, take two page backups,
312
+ launch validate on PAGE1 and stop it in the middle,
313
+ launch restore of PAGE2.
314
+ Expect restore to fail because validation of
315
+ intermediate backup is impossible
316
+ """
317
+ fname = self .id ().split ('.' )[3 ]
318
+ node = self .make_simple_node (
319
+ base_dir = os .path .join (module_name , fname , 'node' ),
320
+ initdb_params = ['--data-checksums' ],
321
+ pg_options = {'wal_level' : 'replica' })
322
+
323
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
324
+ self .init_pb (backup_dir )
325
+ self .add_instance (backup_dir , 'node' , node )
326
+ self .set_archiving (backup_dir , 'node' , node )
327
+ node .slow_start ()
328
+
329
+ # FULL
330
+ self .backup_node (backup_dir , 'node' , node )
331
+
332
+ # PAGE1
333
+ backup_id = self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
334
+
335
+ # PAGE2
336
+ self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
337
+
338
+ gdb = self .validate_pb (
339
+ backup_dir , 'node' , backup_id = backup_id , gdb = True )
340
+
341
+ gdb .set_breakpoint ('pgBackupValidate' )
342
+ gdb .run_until_break ()
343
+
344
+ node .cleanup ()
345
+
346
+ try :
347
+ self .restore_node (backup_dir , 'node' , node )
348
+ self .assertEqual (
349
+ 1 , 0 ,
350
+ "Expecting Error because restore without whole chain validation "
351
+ "is prohibited unless --no-validate provided.\n "
352
+ "Output: {0} \n CMD: {1}" .format (
353
+ repr (self .output ), self .cmd ))
354
+ except ProbackupException as e :
355
+ self .assertTrue (
356
+ "Insert expected error message" .format (
357
+ backup_id ) in e .message ,
358
+ e .message ,
359
+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
360
+ repr (e .message ), self .cmd ))
361
+
362
+ # Clean after yourself
363
+ self .del_test_dir (module_name , fname )
364
+
365
+ def test_locking_concurrent_vaidate_and_backup (self ):
366
+ """
367
+ make node, take full backup, launch validate
368
+ and stop it in the middle, take page backup.
369
+ Expect PAGE backup to be successfully executed
370
+ """
371
+ fname = self .id ().split ('.' )[3 ]
372
+ node = self .make_simple_node (
373
+ base_dir = os .path .join (module_name , fname , 'node' ),
374
+ initdb_params = ['--data-checksums' ],
375
+ pg_options = {'wal_level' : 'replica' })
376
+
377
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
378
+ self .init_pb (backup_dir )
379
+ self .add_instance (backup_dir , 'node' , node )
380
+ self .set_archiving (backup_dir , 'node' , node )
381
+ node .slow_start ()
382
+
383
+ # FULL
384
+ self .backup_node (backup_dir , 'node' , node )
385
+
386
+ # PAGE2
387
+ backup_id = self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
388
+
389
+ gdb = self .validate_pb (
390
+ backup_dir , 'node' , backup_id = backup_id , gdb = True )
391
+
392
+ gdb .set_breakpoint ('pgBackupValidate' )
393
+ gdb .run_until_break ()
394
+
395
+ # This PAGE backup is expected to be successfull
396
+ self .backup_node (backup_dir , 'node' , node , backup_type = 'page' )
397
+
398
+ # Clean after yourself
399
+ self .del_test_dir (module_name , fname )
0 commit comments