From 9da8dc58ba17cec0547671c45d9a6dcb7b4d5a20 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Fri, 22 Feb 2019 11:59:41 +0800 Subject: [PATCH 1/2] fix deploy bugs --- pkg/hostman/guestfs/fsdriver/linux.go | 33 ++++++++++++++----------- pkg/hostman/guestfs/fsdriver/windows.go | 28 +++++++++++++++++++++ 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/pkg/hostman/guestfs/fsdriver/linux.go b/pkg/hostman/guestfs/fsdriver/linux.go index da872b19a4..9aaeeec4cc 100644 --- a/pkg/hostman/guestfs/fsdriver/linux.go +++ b/pkg/hostman/guestfs/fsdriver/linux.go @@ -181,6 +181,7 @@ func (l *sLinuxRootFs) DeployFstabScripts(rootFs IDiskPartition, disks []jsonuti var rec string var modeRwxOwner = syscall.S_IRUSR | syscall.S_IWUSR | syscall.S_IXUSR var fstab = fstabutils.FSTabFile(string(fstabcont)) + fstab.RemoveDevices(len(disks)) for i := 1; i < len(disks); i++ { diskId, err := disks[i].GetString("disk_id") @@ -190,25 +191,27 @@ func (l *sLinuxRootFs) DeployFstabScripts(rootFs IDiskPartition, disks []jsonuti dev := fmt.Sprintf("UUID=%s", diskId) if !fstab.IsExists(dev) { fs, _ := disks[i].GetString("fs") - if fs == "swap" { - rec = fmt.Sprintf("%s none %s sw 0 0", dev, fs) - } else { - mtPath, _ := disks[i].GetString("mountpoint") - if len(mtPath) == 0 { - mtPath = "/data" - if dataDiskIdx > 0 { - mtPath += fmt.Sprintf("%d", dataDiskIdx) + if len(fs) > 0 { + if fs == "swap" { + rec = fmt.Sprintf("%s none %s sw 0 0", dev, fs) + } else { + mtPath, _ := disks[i].GetString("mountpoint") + if len(mtPath) == 0 { + mtPath = "/data" + if dataDiskIdx > 0 { + mtPath += fmt.Sprintf("%d", dataDiskIdx) + } + dataDiskIdx += 1 } - dataDiskIdx += 1 - } - rec = fmt.Sprintf("%s %s %s defaults 2 2", dev, mtPath, fs) - if !l.rootFs.Exists(mtPath, false) { - if err := l.rootFs.Mkdir(mtPath, modeRwxOwner, false); err != nil { - return err + rec = fmt.Sprintf("%s %s %s defaults 2 2", dev, mtPath, fs) + if !l.rootFs.Exists(mtPath, false) { + if err := l.rootFs.Mkdir(mtPath, modeRwxOwner, false); err != nil { + return err + } } } + fstab.AddFsrec(rec) } - fstab.AddFsrec(rec) } } cf := fstab.ToConf() diff --git a/pkg/hostman/guestfs/fsdriver/windows.go b/pkg/hostman/guestfs/fsdriver/windows.go index 7a1bed7d4e..3cda2352d7 100644 --- a/pkg/hostman/guestfs/fsdriver/windows.go +++ b/pkg/hostman/guestfs/fsdriver/windows.go @@ -431,3 +431,31 @@ func (w *SWindowsRootFs) deploySetupCompleteScripts(uname, passwd string) bool { } return true } + +func (w *SWindowsRootFs) DeployFstabScripts(rootFs IDiskPartition, disks []jsonutils.JSONObject) error { + if len(disks) == 1 { + return nil + } + + bootScript := strings.Join([]string{ + `set MOUNT_DISK_SCRIPT=%SystemRoot%\mountdisk.bat`, + `if exist %MOUNT_DISK_SCRIPT% (`, + ` call %MOUNT_DISK_SCRIPT%`, + ` del %MOUNT_DISK_SCRIPT%`, + `)`, + }, "\r\n") + w.appendGuestBootScript(bootScript) + logPath := w.guestDebugLogPath + mountScript := strings.Join([]string{ + w.MakeGuestDebugCmd("mount disk step 1"), + `cscript %SystemRoot%\mountdisk.js --debug ` + logPath, + `del %SystemRoot%\mountdisk.js`, + w.MakeGuestDebugCmd("mount disk step 2"), + }, "\r\n") + + if w.putGuestScriptContents("/windows/mountdisk.bat", mountScript) != nil { + return nil + } + w.putGuestScriptContents("/windows/mountdisk.js", WinScriptMountDisk) + return nil +} From d1a860d7e69eb72d8ba580d944dfc0853d9ffa3f Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Sat, 23 Feb 2019 10:02:51 +0800 Subject: [PATCH 2/2] fix online resize task --- pkg/compute/models/disks.go | 7 ++++++- pkg/compute/models/guests.go | 9 +++++---- pkg/compute/tasks/disk_resize_task.go | 26 +++++++++++++++++++++---- pkg/hostman/diskhandlers/diskhandler.go | 3 +++ pkg/hostman/guestman/qemu-kvm.go | 16 ++++++--------- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 6d4960af37..72addb0a59 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -723,7 +723,12 @@ func (self *SDisk) PerformResize(ctx context.Context, userCred mcclient.TokenCre if err := QuotaManager.CheckSetPendingQuota(ctx, userCred, userCred.GetProjectId(), &pendingUsage); err != nil { return nil, httperrors.NewOutOfQuotaError(err.Error()) } - return nil, self.StartDiskResizeTask(ctx, userCred, int64(sizeMb), "", &pendingUsage, nil) + + guests := self.GetGuests() + if len(guests) != 1 { + return nil, httperrors.NewBadRequestError("Cann't resize disk when attach to mutil guest") + } + return nil, self.StartDiskResizeTask(ctx, userCred, int64(sizeMb), "", &pendingUsage, &guests[0]) } func (self *SDisk) GetIStorage() (cloudprovider.ICloudStorage, error) { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 63c031b230..e1ff563bc2 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -104,10 +104,11 @@ const ( VM_SYNC_CONFIG = "sync_config" VM_SYNC_FAIL = "sync_fail" - VM_RESIZE_DISK = "resize_disk" - VM_START_SAVE_DISK = "start_save_disk" - VM_SAVE_DISK = "save_disk" - VM_SAVE_DISK_FAILED = "save_disk_failed" + VM_RESIZE_DISK = "resize_disk" + VM_RESIZE_DISK_FAILED = "resize_disk_fail" + VM_START_SAVE_DISK = "start_save_disk" + VM_SAVE_DISK = "save_disk" + VM_SAVE_DISK_FAILED = "save_disk_failed" VM_RESTORING_SNAPSHOT = "restoring_snapshot" VM_RESTORE_DISK = "restore_disk" diff --git a/pkg/compute/tasks/disk_resize_task.go b/pkg/compute/tasks/disk_resize_task.go index 308dd9598f..cc8113b6c0 100644 --- a/pkg/compute/tasks/disk_resize_task.go +++ b/pkg/compute/tasks/disk_resize_task.go @@ -48,16 +48,14 @@ func (self *DiskResizeTask) OnInit(ctx context.Context, obj db.IStandaloneModel, disk.SetStatus(self.GetUserCred(), models.DISK_START_RESIZE, "") if masterGuest == nil { - for _, guest := range disk.GetGuests() { - guest.SetStatus(self.GetUserCred(), models.VM_RESIZE_DISK, "") - } + masterGuest.SetStatus(self.GetUserCred(), models.VM_RESIZE_DISK, "") } self.StartResizeDisk(ctx, host, storage, disk, masterGuest) } func (self *DiskResizeTask) StartResizeDisk(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, guest *models.SGuest) { log.Infof("Resizing disk on host %s ...", host.GetName()) - self.SetStage("on_disk_resize_complete", nil) + self.SetStage("OnDiskResizeComplete", nil) sizeMb, _ := self.GetParams().Int("size") if err := host.GetHostDriver().RequestResizeDiskOnHost(ctx, host, storage, disk, guest, sizeMb, self); err != nil { log.Errorf("request_resize_disk_on_host: %v", err) @@ -108,6 +106,21 @@ func (self *DiskResizeTask) OnDiskResizeComplete(ctx context.Context, disk *mode self.CleanHostSchedCache(disk) db.OpsLog.LogEvent(disk, db.ACT_RESIZE, disk.GetShortDesc(ctx), self.UserCred) logclient.AddActionLogWithStartable(self, disk, logclient.ACT_RESIZE, nil, self.UserCred, true) + self.OnDiskResized(ctx, disk) +} + +func (self *DiskResizeTask) OnDiskResized(ctx context.Context, disk *models.SDisk) { + guestId, _ := self.Params.GetString("guest_id") + if len(guestId) > 0 { + self.SetStage("TaskComplete", nil) + masterGuest := models.GuestManager.FetchGuestById(guestId) + masterGuest.StartSyncTask(ctx, self.UserCred, false, self.GetId()) + } else { + self.TaskComplete(ctx, disk, nil) + } +} + +func (self *DiskResizeTask) TaskComplete(ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject) { self.SetStageComplete(ctx, disk.GetShortDesc(ctx)) self.finalReleasePendingUsage(ctx) } @@ -116,5 +129,10 @@ func (self *DiskResizeTask) OnDiskResizeCompleteFailed(ctx context.Context, disk disk.SetDiskReady(ctx, self.GetUserCred(), data.String()) db.OpsLog.LogEvent(disk, db.ACT_RESIZE_FAIL, disk.GetShortDesc(ctx), self.UserCred) logclient.AddActionLogWithStartable(self, disk, logclient.ACT_RESIZE, data.String(), self.UserCred, false) + guestId, _ := self.Params.GetString("guest_id") + if len(guestId) > 0 { + masterGuest := models.GuestManager.FetchGuestById(guestId) + masterGuest.SetStatus(self.UserCred, models.VM_RESIZE_DISK_FAILED, data.String()) + } self.SetStageFailed(ctx, data.String()) } diff --git a/pkg/hostman/diskhandlers/diskhandler.go b/pkg/hostman/diskhandlers/diskhandler.go index db5304c813..c2d6a9279f 100644 --- a/pkg/hostman/diskhandlers/diskhandler.go +++ b/pkg/hostman/diskhandlers/diskhandler.go @@ -6,6 +6,7 @@ import ( "net/http" "yunion.io/x/jsonutils" + "yunion.io/x/log" "yunion.io/x/pkg/util/regutils" "yunion.io/x/onecloud/pkg/appsrv" @@ -174,11 +175,13 @@ func diskDelete(ctx context.Context, storage storageman.IStorage, diskId string, } func diskResize(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) { + log.Errorln(body.String()) diskInfo, err := body.Get("disk") if err != nil { return nil, httperrors.NewMissingParameterError("disk") } serverId, _ := diskInfo.GetString("server_id") + log.Errorln(serverId, guestman.GetGuestManager().Status(serverId)) if len(serverId) > 0 && guestman.GetGuestManager().Status(serverId) == "running" { sizeMb, _ := diskInfo.Int("size") return guestman.GetGuestManager().OnlineResizeDisk(ctx, serverId, diskId, sizeMb) diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index d1791909e6..71f7b345ae 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -53,8 +53,7 @@ type SKVMGuestInstance struct { Monitor monitor.Monitor manager *SGuestManager - startupTask *SGuestResumeTask - mirrorJobSuccCount *int + startupTask *SGuestResumeTask } func NewKVMGuestInstance(id string, manager *SGuestManager) *SKVMGuestInstance { @@ -349,14 +348,11 @@ func (s *SKVMGuestInstance) onReceiveQMPEvent(event *monitor.Event) { if itype, ok := event.Data["type"]; ok { stype, _ := itype.(string) if stype == "mirror" { - if s.mirrorJobSuccCount != nil { - *s.mirrorJobSuccCount += 1 - } else { - s.mirrorJobSuccCount = new(int) - *s.mirrorJobSuccCount = 1 - } - if *s.mirrorJobSuccCount >= s.DiskCount() { - hostutils.UpdateServerStatus(context.Background(), s.GetId(), "running") + if s.IsMirrorJobSucc() { + _, err := hostutils.UpdateServerStatus(context.Background(), s.GetId(), "running") + if err != nil { + log.Errorln("onReceiveQMPEvent update server status error: %s", err) + } } } }