@@ -305,3 +305,95 @@ def test_locking_running_3(self):
305305
306306 # Clean after yourself
307307 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