diff --git a/pkg/multicloud/openstack/disk.go b/pkg/multicloud/openstack/disk.go index c7de4c8054..197bd5646a 100644 --- a/pkg/multicloud/openstack/disk.go +++ b/pkg/multicloud/openstack/disk.go @@ -175,25 +175,40 @@ func (disk *SDisk) Delete(ctx context.Context) error { return cloudprovider.WaitDeleted(disk, 10*time.Second, 8*time.Minute) } -func (disk *SDisk) attachInstances(instanceIds []string) { - for _, instanceId := range instanceIds { - if err := disk.storage.zone.region.AttachDisk(instanceId, disk.ID); err != nil { - log.Errorf("recover attach disk %s => instance %s error: %v", disk.ID, instanceId, err) +func (disk *SDisk) attachInstances(attachments []Attachment) error { + for _, attachment := range attachments { + startTime := time.Now() + for time.Now().Sub(startTime) < 5*time.Minute { + if err := disk.storage.zone.region.AttachDisk(attachment.ServerID, disk.ID); err != nil { + if strings.Contains(err.Error(), "status must be available or downloading") { + time.Sleep(time.Second * 10) + continue + } + log.Errorf("recover attach disk %s => instance %s error: %v", disk.ID, attachment.ServerID, err) + return err + } else { + return nil + } } } + return nil } func (disk *SDisk) Resize(ctx context.Context, sizeMb int64) error { instanceIds := []string{} - defer disk.attachInstances(instanceIds) for _, attachement := range disk.Attachments { if err := disk.storage.zone.region.DetachDisk(attachement.ServerID, disk.ID); err != nil { return err } instanceIds = append(instanceIds, attachement.ServerID) } - return disk.storage.zone.region.ResizeDisk(disk.ID, sizeMb) + err := disk.storage.zone.region.ResizeDisk(disk.ID, sizeMb) + if err != nil { + disk.attachInstances(disk.Attachments) + return err + } + return disk.attachInstances(disk.Attachments) } func (disk *SDisk) GetName() string {