Skip to content

Commit 507b7e1

Browse files
committed
Merge branch '605-cleanup-clone-dataset' into 'master'
fix: clean up clone dataset on destroy Closes #605 See merge request postgres-ai/database-lab!1052
2 parents fe79838 + 1524b7d commit 507b7e1

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)