@@ -274,10 +274,8 @@ func (p *Provisioner) ResetSession(session *resources.Session, clone *models.Clo
274274return nil ,errors .Wrap (err ,"failed to stop container" )
275275}
276276
277- if clone .Revision == branching .DefaultRevision || ! clone .HasDependent {
278- if err = fsm .DestroyClone (clone .Branch ,name ,clone .Revision );err != nil {
279- return nil ,errors .Wrap (err ,"failed to destroy clone" )
280- }
277+ if err = fsm .DestroyClone (clone .Branch ,name ,clone .Revision );err != nil {
278+ return nil ,errors .Wrap (err ,"failed to destroy clone" )
281279}
282280
283281if err = newFSManager .CreateClone (clone .Branch ,name ,snapshot .ID ,clone .Revision );err != nil {
@@ -300,9 +298,14 @@ func (p *Provisioner) ResetSession(session *resources.Session, clone *models.Clo
300298}
301299
302300snapshotModel := & models.Snapshot {
303- ID :snapshot .ID ,
304- CreatedAt :models .NewLocalTime (snapshot .CreatedAt ),
305- DataStateAt :models .NewLocalTime (snapshot .DataStateAt ),
301+ ID :snapshot .ID ,
302+ CreatedAt :models .NewLocalTime (snapshot .CreatedAt ),
303+ DataStateAt :models .NewLocalTime (snapshot .DataStateAt ),
304+ PhysicalSize :snapshot .Used ,
305+ LogicalSize :snapshot .LogicalReferenced ,
306+ Pool :snapshot .Pool ,
307+ Branch :snapshot .Branch ,
308+ Message :snapshot .Message ,
306309}
307310
308311return snapshotModel ,nil
@@ -335,6 +338,31 @@ func (p *Provisioner) GetSessionState(s *resources.Session, branch, cloneID stri
335338return fsm .GetSessionState (branch ,cloneID )
336339}
337340
341+ // GetBatchSessionState retrieves session states for multiple clones efficiently.
342+ func (p * Provisioner )GetBatchSessionState (batch map [string ][]resources.SessionStateRequest ) (map [string ]resources.SessionState ,error ) {
343+ batchResults := make (map [string ]resources.SessionState )
344+
345+ for poolName ,reqs := range batch {
346+ fsm ,err := p .pm .GetFSManager (poolName )
347+ if err != nil {
348+ log .Err (fmt .Sprintf ("failed to find filesystem manager for pool %s: %v" ,poolName ,err ))
349+ continue
350+ }
351+
352+ results ,err := fsm .GetBatchSessionState (reqs )
353+ if err != nil {
354+ log .Err (fmt .Sprintf ("failed to get batch session state for pool %s: %v" ,poolName ,err ))
355+ continue
356+ }
357+
358+ for cloneID ,state := range results {
359+ batchResults [cloneID ]= state
360+ }
361+ }
362+
363+ return batchResults ,nil
364+ }
365+
338366// GetPoolEntryList provides an ordered list of available pools.
339367func (p * Provisioner )GetPoolEntryList () []models.PoolEntry {
340368fsmList := p .pm .GetFSManagerOrderedList ()
@@ -604,10 +632,8 @@ func (p *Provisioner) CleanupCloneDataset(clone *models.Clone, pool string) erro
604632return nil
605633}
606634
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- }
635+ if err = fsm .DestroyClone (clone .Branch ,clone .ID ,clone .Revision );err != nil {
636+ return fmt .Errorf ("failed to destroy clone: %w" ,err )
611637}
612638
613639return nil