@@ -571,6 +571,48 @@ func (p *Provisioner) StopAllSessions(exceptClones map[string]struct{}) error {
571571	return  nil 
572572}
573573
574+ func  reviewDown (repo  * models.Repo , cloneDataset  string ) string  {
575+ 	for  snapshotID  :=  range  repo .Snapshots  {
576+ 		if  strings .HasPrefix (snapshotID , cloneDataset ) {
577+ 			return  snapshotID 
578+ 		}
579+ 	}
580+ 
581+ 	return  "" 
582+ }
583+ 
584+ // CleanupCloneDataset removes a clone dataset. 
585+ func  (p  * Provisioner ) CleanupCloneDataset (clone  * models.Clone , pool  string ) error  {
586+ 	if  clone .Snapshot  ==  nil  {
587+ 		return  fmt .Errorf ("clone has no snapshot, so the pool cannot be determined. Skip cleanup" )
588+ 	}
589+ 
590+ 	fsm , err  :=  p .pm .GetFSManager (clone .Snapshot .Pool )
591+ 	if  err  !=  nil  {
592+ 		return  fmt .Errorf ("cannot work with pool %s: %w" , pool , err )
593+ 	}
594+ 
595+ 	repo , err  :=  fsm .GetRepo ()
596+ 	if  err  !=  nil  {
597+ 		return  fmt .Errorf ("failed to get snapshots: %w" , err )
598+ 	}
599+ 
600+ 	snapshotDep  :=  reviewDown (repo , branching .CloneName (pool , clone .Branch , clone .ID , clone .Revision ))
601+ 	if  snapshotDep  !=  ""  {
602+ 		log .Dbg (fmt .Sprintf ("Dataset has commit: %s. Skip destroying" , snapshotDep ))
603+ 
604+ 		return  nil 
605+ 	}
606+ 
607+ 	if  clone .Revision  ==  branching .DefaultRevision  &&  ! clone .HasDependent  {
608+ 		if  err  :=  fsm .DestroyDataset (branching .CloneDataset (pool , clone .Branch , clone .ID )); err  !=  nil  {
609+ 			return  fmt .Errorf ("failed to destroy clone dataset: %w" , err )
610+ 		}
611+ 	}
612+ 
613+ 	return  nil 
614+ }
615+ 
574616func  (p  * Provisioner ) stopPoolSessions (fsm  pool.FSManager , exceptClones  map [string ]struct {}) error  {
575617	fsPool  :=  fsm .Pool ()
576618
0 commit comments