From 1ad4f9e7d0e7771e39220b3dc4bb73271a655a28 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Sun, 13 Feb 2022 19:23:10 +0800 Subject: [PATCH] fix: delete disk skip recycle_bin --- pkg/apis/compute/disk.go | 4 ++++ pkg/hostman/guestman/qemu-kvm.go | 5 +++-- pkg/hostman/storageman/disk_base.go | 2 +- pkg/hostman/storageman/disk_local.go | 11 ++++++----- pkg/hostman/storageman/disk_rbd.go | 9 +++++---- pkg/hostman/storageman/diskhandlers/diskhandler.go | 2 +- pkg/hostman/storageman/imagecache_rbd.go | 2 +- pkg/hostman/storageman/storage_base.go | 6 +++--- pkg/hostman/storageman/storage_local.go | 4 ++-- pkg/hostman/storageman/storage_rbd.go | 2 +- 10 files changed, 27 insertions(+), 20 deletions(-) diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index 50afa624bf..c6067ba49d 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -297,3 +297,7 @@ type DiskAllocateFromBackupInput struct { BackupStorageId string BackupStorageAccessInfo *jsonutils.JSONDict } + +type DiskDeleteInput struct { + SkipRecycle *bool +} diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index a491ec7736..76e584472c 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -1028,11 +1028,12 @@ func (s *SKVMGuestInstance) delTmpDisks(ctx context.Context, migrated bool) erro diskPath, _ := disk.GetString("path") d, _ := storageman.GetManager().GetDiskByPath(diskPath) if d != nil && d.GetType() == api.STORAGE_LOCAL && migrated { - if err := d.DeleteAllSnapshot(); err != nil { + skipRecycle := true + if err := d.DeleteAllSnapshot(skipRecycle); err != nil { log.Errorln(err) return err } - if _, err := d.Delete(ctx, nil); err != nil { + if _, err := d.Delete(ctx, api.DiskDeleteInput{SkipRecycle: &skipRecycle}); err != nil { log.Errorln(err) return err } diff --git a/pkg/hostman/storageman/disk_base.go b/pkg/hostman/storageman/disk_base.go index c9e709f3be..9adf3d21a2 100644 --- a/pkg/hostman/storageman/disk_base.go +++ b/pkg/hostman/storageman/disk_base.go @@ -41,7 +41,7 @@ type IDisk interface { OnRebuildRoot(ctx context.Context, params api.DiskAllocateInput) error DoDeleteSnapshot(snapshotId string) error - DeleteAllSnapshot() error + DeleteAllSnapshot(skipRecycle bool) error DiskSnapshot(ctx context.Context, params interface{}) (jsonutils.JSONObject, error) DiskDeleteSnapshot(ctx context.Context, params interface{}) (jsonutils.JSONObject, error) Delete(ctx context.Context, params interface{}) (jsonutils.JSONObject, error) diff --git a/pkg/hostman/storageman/disk_local.go b/pkg/hostman/storageman/disk_local.go index 4c582d5235..a43576bd41 100644 --- a/pkg/hostman/storageman/disk_local.go +++ b/pkg/hostman/storageman/disk_local.go @@ -114,9 +114,10 @@ func (d *SLocalDisk) UmountFuseImage() { } func (d *SLocalDisk) Delete(ctx context.Context, params interface{}) (jsonutils.JSONObject, error) { + p := params.(api.DiskDeleteInput) dpath := d.GetPath() log.Infof("Delete guest disk %s", dpath) - if err := d.Storage.DeleteDiskfile(dpath); err != nil { + if err := d.Storage.DeleteDiskfile(dpath, p.SkipRecycle != nil && *p.SkipRecycle); err != nil { return nil, err } d.UmountFuseImage() @@ -136,7 +137,7 @@ func (d *SLocalDisk) Delete(ctx context.Context, params interface{}) (jsonutils. } func (d *SLocalDisk) OnRebuildRoot(ctx context.Context, params api.DiskAllocateInput) error { - _, err := d.Delete(ctx, params) + _, err := d.Delete(ctx, api.DiskDeleteInput{}) return err } @@ -572,13 +573,13 @@ func (d *SLocalDisk) CleanupSnapshots(ctx context.Context, params interface{}) ( return nil, nil } -func (d *SLocalDisk) DeleteAllSnapshot() error { +func (d *SLocalDisk) DeleteAllSnapshot(skipRecycle bool) error { snapshotDir := d.GetSnapshotDir() if !fileutils2.Exists(snapshotDir) { return nil } if options.HostOptions.RecycleDiskfile { - return d.Storage.DeleteDiskfile(snapshotDir) + return d.Storage.DeleteDiskfile(snapshotDir, skipRecycle) } else { log.Infof("Delete disk(%s) snapshot dir %s", d.Id, snapshotDir) return procutils.NewCommand("rm", "-rf", snapshotDir).Run() @@ -607,5 +608,5 @@ func (d *SLocalDisk) PrepareMigrate(liveMigrate bool) (string, error) { func (d *SLocalDisk) DoDeleteSnapshot(snapshotId string) error { snapshotPath := path.Join(d.GetSnapshotDir(), snapshotId) - return d.Storage.DeleteDiskfile(snapshotPath) + return d.Storage.DeleteDiskfile(snapshotPath, false) } diff --git a/pkg/hostman/storageman/disk_rbd.go b/pkg/hostman/storageman/disk_rbd.go index 25d522061b..9351f21aed 100644 --- a/pkg/hostman/storageman/disk_rbd.go +++ b/pkg/hostman/storageman/disk_rbd.go @@ -86,20 +86,21 @@ func (d *SRBDDisk) GetDiskSetupScripts(idx int) string { return fmt.Sprintf("DISK_%d=%s\n", idx, d.GetPath()) } -func (d *SRBDDisk) DeleteAllSnapshot() error { +func (d *SRBDDisk) DeleteAllSnapshot(skipRecycle bool) error { return fmt.Errorf("Not Impl") } func (d *SRBDDisk) Delete(ctx context.Context, params interface{}) (jsonutils.JSONObject, error) { + p := params.(api.DiskDeleteInput) storage := d.Storage.(*SRbdStorage) storageConf := d.Storage.GetStorageConf() pool, _ := storageConf.GetString("pool") - return nil, storage.deleteImage(pool, d.Id) + return nil, storage.deleteImage(pool, d.Id, p.SkipRecycle != nil && *p.SkipRecycle) } func (d *SRBDDisk) OnRebuildRoot(ctx context.Context, params api.DiskAllocateInput) error { if len(params.BackingDiskId) == 0 { - _, err := d.Delete(ctx, params) + _, err := d.Delete(ctx, api.DiskDeleteInput{}) return err } storage := d.Storage.(*SRbdStorage) @@ -191,7 +192,7 @@ func (d *SRBDDisk) createFromTemplate(ctx context.Context, imageId, format strin storage := d.Storage.(*SRbdStorage) destPool, _ := storage.StorageConf.GetString("pool") - storage.deleteImage(destPool, d.Id) //重装系统时,需要删除以前的系统盘 + storage.deleteImage(destPool, d.Id, false) //重装系统时,需要删除以前的系统盘 err = storage.cloneImage(ctx, imageCacheManager.GetPath(), imageCache.GetName(), destPool, d.Id) if err != nil { return nil, errors.Wrapf(err, "cloneImage(%s)", imageCache.GetName()) diff --git a/pkg/hostman/storageman/diskhandlers/diskhandler.go b/pkg/hostman/storageman/diskhandlers/diskhandler.go index e3d9b957da..4c77859afb 100644 --- a/pkg/hostman/storageman/diskhandlers/diskhandler.go +++ b/pkg/hostman/storageman/diskhandlers/diskhandler.go @@ -274,7 +274,7 @@ func diskCreate(ctx context.Context, storage storageman.IStorage, diskId string, func diskDelete(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) { if disk != nil { - hostutils.DelayTask(ctx, disk.Delete, nil) + hostutils.DelayTask(ctx, disk.Delete, compute.DiskDeleteInput{}) } else { hostutils.DelayTask(ctx, nil, nil) } diff --git a/pkg/hostman/storageman/imagecache_rbd.go b/pkg/hostman/storageman/imagecache_rbd.go index 20e3b2e941..d3c7b44863 100644 --- a/pkg/hostman/storageman/imagecache_rbd.go +++ b/pkg/hostman/storageman/imagecache_rbd.go @@ -103,7 +103,7 @@ func (r *SRbdImageCache) Release() { func (r *SRbdImageCache) Remove(ctx context.Context) error { imageCacheManger := r.Manager.(*SRbdImageCacheManager) storage := imageCacheManger.storage.(*SRbdStorage) - if err := storage.deleteImage(r.Manager.GetPath(), r.GetName()); err != nil { + if err := storage.deleteImage(r.Manager.GetPath(), r.GetName(), false); err != nil { return err } diff --git a/pkg/hostman/storageman/storage_base.go b/pkg/hostman/storageman/storage_base.go index 440d26b6b9..14238ccdef 100644 --- a/pkg/hostman/storageman/storage_base.go +++ b/pkg/hostman/storageman/storage_base.go @@ -131,7 +131,7 @@ type IStorage interface { CreateSnapshotFormUrl(ctx context.Context, snapshotUrl, diskId, snapshotPath string) error - DeleteDiskfile(diskPath string) error + DeleteDiskfile(diskPath string, skipRecycle bool) error GetFuseTmpPath() string GetFuseMountPath() string GetImgsaveBackupPath() string @@ -313,7 +313,7 @@ func (s *SBaseStorage) RemoveDisk(d IDisk) { } } -func (s *SBaseStorage) DeleteDiskfile(diskpath string) error { +func (s *SBaseStorage) DeleteDiskfile(diskpath string, skipRecycle bool) error { return fmt.Errorf("Not Implement") } @@ -566,7 +566,7 @@ func requestDeleteSnapshot( return } if !pendingDelete { - if err := storage.DeleteDiskfile(deleteSnapshotPath); err != nil { + if err := storage.DeleteDiskfile(deleteSnapshotPath, false); err != nil { log.Errorln(err) return } diff --git a/pkg/hostman/storageman/storage_local.go b/pkg/hostman/storageman/storage_local.go index 1c42ba7b4e..bb68d70948 100644 --- a/pkg/hostman/storageman/storage_local.go +++ b/pkg/hostman/storageman/storage_local.go @@ -291,9 +291,9 @@ func (s *SLocalStorage) Detach() error { return nil } -func (s *SLocalStorage) DeleteDiskfile(diskpath string) error { +func (s *SLocalStorage) DeleteDiskfile(diskpath string, skipRecycle bool) error { log.Infof("Start Delete %s", diskpath) - if options.HostOptions.RecycleDiskfile { + if options.HostOptions.RecycleDiskfile && !skipRecycle { var ( destDir = s.getRecyclePath() destFile = fmt.Sprintf("%s.%d", path.Base(diskpath), time.Now().Unix()) diff --git a/pkg/hostman/storageman/storage_rbd.go b/pkg/hostman/storageman/storage_rbd.go index f6ce86b163..fe27de0829 100644 --- a/pkg/hostman/storageman/storage_rbd.go +++ b/pkg/hostman/storageman/storage_rbd.go @@ -198,7 +198,7 @@ func (s *SRbdStorage) resizeImage(pool string, name string, sizeMb uint64) error return img.Resize(int64(sizeMb)) } -func (s *SRbdStorage) deleteImage(pool string, name string) error { +func (s *SRbdStorage) deleteImage(pool string, name string, skipRecycle bool) error { client, err := s.GetClient() if err != nil { return errors.Wrapf(err, "GetClient")