mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-05-06 21:52:54 +08:00
fix(region): record snapshot last attched host on delete disk (#21927)
This commit is contained in:
@@ -2369,6 +2369,25 @@ func (self *SDisk) GetLastAttachedHost(ctx context.Context, userCred mcclient.To
|
||||
return self.GetMetadata(ctx, api.DISK_META_LAST_ATTACHED_HOST, userCred)
|
||||
}
|
||||
|
||||
func (self *SDisk) RecordDiskSnapshotsLastHost(ctx context.Context, userCred mcclient.TokenCredential, hostId string) error {
|
||||
storage, err := self.GetStorage()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if storage.StorageType != api.STORAGE_SLVM {
|
||||
return nil
|
||||
}
|
||||
// record disk snapshots master host
|
||||
snaps := SnapshotManager.GetDiskSnapshots(self.Id)
|
||||
for i := range snaps {
|
||||
err = snaps[i].SetMetadata(ctx, api.DISK_META_LAST_ATTACHED_HOST, hostId, userCred)
|
||||
if err != nil {
|
||||
log.Errorf("snapshot %s failed set last attached host: %s", snaps[i].Id, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 同步磁盘状态
|
||||
func (self *SDisk) PerformSyncstatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.DiskSyncstatusInput) (jsonutils.JSONObject, error) {
|
||||
var openTask = true
|
||||
|
||||
@@ -97,11 +97,29 @@ func (self *SBaseStorageDriver) RequestDeleteSnapshot(ctx context.Context, snaps
|
||||
}
|
||||
}
|
||||
if guest == nil {
|
||||
storage := snapshot.GetStorage()
|
||||
host, err := storage.GetMasterHost()
|
||||
if err != nil {
|
||||
return err
|
||||
var host *models.SHost
|
||||
disk, err := models.DiskManager.FetchById(snapshot.DiskId)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return errors.Wrap(err, "get disk by snapshot")
|
||||
}
|
||||
if disk != nil {
|
||||
sDisk := disk.(*models.SDisk)
|
||||
if hostId := sDisk.GetLastAttachedHost(ctx, task.GetUserCred()); hostId != "" {
|
||||
host = models.HostManager.FetchHostById(hostId)
|
||||
}
|
||||
} else {
|
||||
if hostId := snapshot.GetMetadata(ctx, api.DISK_META_LAST_ATTACHED_HOST, task.GetUserCred()); hostId != "" {
|
||||
host = models.HostManager.FetchHostById(hostId)
|
||||
}
|
||||
}
|
||||
if host == nil {
|
||||
storage := snapshot.GetStorage()
|
||||
host, err = storage.GetMasterHost()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
convertSnapshot, err := models.SnapshotManager.GetConvertSnapshot(snapshot)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return errors.Wrap(err, "get convert snapshot")
|
||||
@@ -109,10 +127,7 @@ func (self *SBaseStorageDriver) RequestDeleteSnapshot(ctx context.Context, snaps
|
||||
params := jsonutils.NewDict()
|
||||
params.Set("delete_snapshot", jsonutils.NewString(snapshot.Id))
|
||||
params.Set("disk_id", jsonutils.NewString(snapshot.DiskId))
|
||||
disk, err := models.DiskManager.FetchById(snapshot.DiskId)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return errors.Wrap(err, "get disk by snapshot")
|
||||
}
|
||||
|
||||
if disk != nil {
|
||||
sDisk, _ := disk.(*models.SDisk)
|
||||
if sDisk.IsEncrypted() {
|
||||
|
||||
@@ -130,6 +130,10 @@ func (self *DiskDeleteTask) startDeleteDisk(ctx context.Context, disk *models.SD
|
||||
}
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
disk.RecordDiskSnapshotsLastHost(ctx, self.UserCred, host.Id)
|
||||
}
|
||||
|
||||
isPurge := false
|
||||
if (host == nil || !host.GetEnabled()) && purgeParams {
|
||||
isPurge = true
|
||||
|
||||
Reference in New Issue
Block a user