From 1058e72597c33dcf2e313d8ffb1dc4fd2d3be5f9 Mon Sep 17 00:00:00 2001 From: ioito Date: Wed, 21 Aug 2019 15:14:44 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20=E9=81=BF=E5=85=8Dopenstack=E7=A3=81?= =?UTF-8?q?=E7=9B=98=E6=89=A9=E5=AE=B9=E6=88=90=E5=8A=9F=E5=90=8E=E6=9C=AA?= =?UTF-8?q?=E8=83=BD=E6=8C=82=E8=BD=BD=E5=88=B0=E8=99=9A=E6=8B=9F=E6=9C=BA?= =?UTF-8?q?=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/multicloud/openstack/disk.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) 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 {