Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1524b7d

Browse files
committed
fix: clean up clone dataset on destroy
1 parent fe79838 commit 1524b7d

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

‎engine/internal/cloning/base.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,13 @@ func (c *Base) destroyClone(cloneID string, w *CloneWrapper) {
387387
if w.Clone.Snapshot != nil {
388388
c.decrementCloneNumber(w.Clone.Snapshot.ID)
389389
}
390+
390391
c.observingCh <- cloneID
391392

393+
if err := c.provision.CleanupCloneDataset(w.Clone, w.Clone.Snapshot.Pool); err != nil {
394+
log.Errf("failed to cleanup clone dataset: %v", err)
395+
}
396+
392397
c.SaveClonesState()
393398

394399
c.webhookCh <- webhooks.CloneEvent{

‎engine/internal/provision/mode_local.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
574616
func (p *Provisioner) stopPoolSessions(fsm pool.FSManager, exceptClones map[string]struct{}) error {
575617
fsPool := fsm.Pool()
576618

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /