@@ -7000,6 +7000,11 @@ def test_subvolume_snapshot_clone_cancel_pending(self):
70007000 # snapshot subvolume
70017001 self ._fs_cmd ("subvolume" , "snapshot" , "create" , self .volname , subvolume , snapshot )
70027002
7003+ # Disable the snapshot_clone_no_wait config option
7004+ self .config_set ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' , False )
7005+ threads_available = self .config_get ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' )
7006+ self .assertEqual (threads_available , 'false' )
7007+
70037008 # schedule clones
70047009 for clone in clones :
70057010 self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone )
@@ -7485,6 +7490,159 @@ def test_subvolume_under_group_snapshot_clone(self):
74857490 # verify trash dir is clean
74867491 self ._wait_for_trash_empty ()
74877492
7493+ def test_subvolume_snapshot_clone_with_no_wait_enabled (self ):
7494+ subvolume = self ._gen_subvol_name ()
7495+ snapshot = self ._gen_subvol_snap_name ()
7496+ clone1 , clone2 , clone3 = self ._gen_subvol_clone_name (3 )
7497+
7498+ # create subvolume
7499+ self ._fs_cmd ("subvolume" , "create" , self .volname , subvolume , "--mode=777" )
7500+
7501+ # do some IO
7502+ self ._do_subvolume_io (subvolume , number_of_files = 10 )
7503+
7504+ # snapshot subvolume
7505+ self ._fs_cmd ("subvolume" , "snapshot" , "create" , self .volname , subvolume , snapshot )
7506+
7507+ # Decrease number of cloner threads
7508+ self .config_set ('mgr' , 'mgr/volumes/max_concurrent_clones' , 2 )
7509+ max_concurrent_clones = int (self .config_get ('mgr' , 'mgr/volumes/max_concurrent_clones' ))
7510+ self .assertEqual (max_concurrent_clones , 2 )
7511+
7512+ # Enable the snapshot_clone_no_wait config option
7513+ self .config_set ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' , True )
7514+ threads_available = self .config_get ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' )
7515+ self .assertEqual (threads_available , 'true' )
7516+
7517+ # Insert delay of 15 seconds at the beginning of the snapshot clone
7518+ self .config_set ('mgr' , 'mgr/volumes/snapshot_clone_delay' , 15 )
7519+
7520+ # schedule a clone1
7521+ self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone1 )
7522+
7523+ # schedule a clone2
7524+ self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone2 )
7525+
7526+ # schedule a clone3
7527+ cmd_ret = self .run_ceph_cmd (
7528+ args = ["fs" , "subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone3 ], check_status = False , stdout = StringIO (),
7529+ stderr = StringIO ())
7530+ self .assertEqual (cmd_ret .returncode , errno .EAGAIN , "Expecting EAGAIN error" )
7531+
7532+ # check clone1 status
7533+ self ._wait_for_clone_to_complete (clone1 )
7534+
7535+ # verify clone1
7536+ self ._verify_clone (subvolume , snapshot , clone1 )
7537+
7538+ # check clone2 status
7539+ self ._wait_for_clone_to_complete (clone2 )
7540+
7541+ # verify clone2
7542+ self ._verify_clone (subvolume , snapshot , clone2 )
7543+
7544+ # schedule clone3 , it should be successful this time
7545+ self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone3 )
7546+
7547+ # check clone3 status
7548+ self ._wait_for_clone_to_complete (clone3 )
7549+
7550+ # verify clone3
7551+ self ._verify_clone (subvolume , snapshot , clone3 )
7552+
7553+ # set number of cloner threads to default
7554+ self .config_set ('mgr' , 'mgr/volumes/max_concurrent_clones' , 4 )
7555+ max_concurrent_clones = int (self .config_get ('mgr' , 'mgr/volumes/max_concurrent_clones' ))
7556+ self .assertEqual (max_concurrent_clones , 4 )
7557+
7558+ # set the snapshot_clone_delay to default
7559+ self .config_set ('mgr' , 'mgr/volumes/snapshot_clone_delay' , 0 )
7560+
7561+ # remove snapshot
7562+ self ._fs_cmd ("subvolume" , "snapshot" , "rm" , self .volname , subvolume , snapshot )
7563+
7564+ # remove subvolumes
7565+ self ._fs_cmd ("subvolume" , "rm" , self .volname , subvolume )
7566+ self ._fs_cmd ("subvolume" , "rm" , self .volname , clone1 )
7567+ self ._fs_cmd ("subvolume" , "rm" , self .volname , clone2 )
7568+ self ._fs_cmd ("subvolume" , "rm" , self .volname , clone3 )
7569+
7570+ # verify trash dir is clean
7571+ self ._wait_for_trash_empty ()
7572+
7573+ def test_subvolume_snapshot_clone_with_no_wait_not_enabled (self ):
7574+ subvolume = self ._gen_subvol_name ()
7575+ snapshot = self ._gen_subvol_snap_name ()
7576+ clone1 , clone2 , clone3 = self ._gen_subvol_clone_name (3 )
7577+
7578+ # create subvolume
7579+ self ._fs_cmd ("subvolume" , "create" , self .volname , subvolume , "--mode=777" )
7580+
7581+ # do some IO
7582+ self ._do_subvolume_io (subvolume , number_of_files = 10 )
7583+
7584+ # snapshot subvolume
7585+ self ._fs_cmd ("subvolume" , "snapshot" , "create" , self .volname , subvolume , snapshot )
7586+
7587+ # Disable the snapshot_clone_no_wait config option
7588+ self .config_set ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' , False )
7589+ threads_available = self .config_get ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' )
7590+ self .assertEqual (threads_available , 'false' )
7591+
7592+ # Decrease number of cloner threads
7593+ self .config_set ('mgr' , 'mgr/volumes/max_concurrent_clones' , 2 )
7594+ max_concurrent_clones = int (self .config_get ('mgr' , 'mgr/volumes/max_concurrent_clones' ))
7595+ self .assertEqual (max_concurrent_clones , 2 )
7596+
7597+ # schedule a clone1
7598+ self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone1 )
7599+
7600+ # schedule a clone2
7601+ self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone2 )
7602+
7603+ # schedule a clone3
7604+ self ._fs_cmd ("subvolume" , "snapshot" , "clone" , self .volname , subvolume , snapshot , clone3 )
7605+
7606+ # check clone1 status
7607+ self ._wait_for_clone_to_complete (clone1 )
7608+
7609+ # verify clone1
7610+ self ._verify_clone (subvolume , snapshot , clone1 )
7611+
7612+ # check clone2 status
7613+ self ._wait_for_clone_to_complete (clone2 )
7614+
7615+ # verify clone2
7616+ self ._verify_clone (subvolume , snapshot , clone2 )
7617+
7618+ # check clone3 status
7619+ self ._wait_for_clone_to_complete (clone3 )
7620+
7621+ # verify clone3
7622+ self ._verify_clone (subvolume , snapshot , clone3 )
7623+
7624+ # set the snapshot_clone_no_wait config option to default
7625+ self .config_set ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' , True )
7626+ threads_available = self .config_get ('mgr' , 'mgr/volumes/snapshot_clone_no_wait' )
7627+ self .assertEqual (threads_available , 'true' )
7628+
7629+ # set number of cloner threads to default
7630+ self .config_set ('mgr' , 'mgr/volumes/max_concurrent_clones' , 4 )
7631+ max_concurrent_clones = int (self .config_get ('mgr' , 'mgr/volumes/max_concurrent_clones' ))
7632+ self .assertEqual (max_concurrent_clones , 4 )
7633+
7634+ # remove snapshot
7635+ self ._fs_cmd ("subvolume" , "snapshot" , "rm" , self .volname , subvolume , snapshot )
7636+
7637+ # remove subvolumes
7638+ self ._fs_cmd ("subvolume" , "rm" , self .volname , subvolume )
7639+ self ._fs_cmd ("subvolume" , "rm" , self .volname , clone1 )
7640+ self ._fs_cmd ("subvolume" , "rm" , self .volname , clone2 )
7641+ self ._fs_cmd ("subvolume" , "rm" , self .volname , clone3 )
7642+
7643+ # verify trash dir is clean
7644+ self ._wait_for_trash_empty ()
7645+
74887646
74897647class TestMisc (TestVolumesHelper ):
74907648 """Miscellaneous tests related to FS volume, subvolume group, and subvolume operations."""
0 commit comments