Merge pull request #2741 from wanyaoqi/bugfix/wyq/io-throttle-add-log-event

bugfix: io throttle add log event
This commit is contained in:
yunion-ci-robot
2019-09-07 19:08:18 +08:00
committed by GitHub
8 changed files with 85 additions and 6 deletions
+3
View File
@@ -108,6 +108,9 @@ const (
VM_REMOVE_STATEFILE = "remove_state"
VM_IO_THROTTLE = "io_throttle"
VM_IO_THROTTLE_FAIL = "io_throttle_fail"
VM_ADMIN = "admin"
VM_IMPORT = "import"
+3
View File
@@ -135,6 +135,9 @@ const (
ACT_VM_DEPLOY = "deploy"
ACT_VM_DEPLOY_FAIL = "deploy_fail"
ACT_VM_IO_THROTTLE = "io_throttle"
ACT_VM_IO_THROTTLE_FAIL = "io_throttle_fail"
ACT_REBUILDING_ROOT = "rebuilding_root"
ACT_REBUILD_ROOT = "rebuild_root"
ACT_REBUILD_ROOT_FAIL = "rebuild_root_fail"
+2
View File
@@ -3511,6 +3511,8 @@ func (self *SGuest) StartBlockIoThrottleTask(ctx context.Context, userCred mccli
params := jsonutils.NewDict()
params.Set("bps", jsonutils.NewInt(bpsMb))
params.Set("iops", jsonutils.NewInt(iops))
params.Set("old_status", jsonutils.NewString(self.Status))
self.SetStatus(userCred, api.VM_IO_THROTTLE, "start block io throttle task")
task, err := taskman.TaskManager.NewTask(ctx, "GuestBlockIoThrottleTask", self, userCred, params, "", "", nil)
if err != nil {
log.Errorf("%s", err)
+6
View File
@@ -61,6 +61,8 @@ type SGuestdisk struct {
Driver string `width:"32" charset:"ascii" nullable:"true" list:"user" update:"user"` // Column(VARCHAR(32, charset='ascii'), nullable=True)
CacheMode string `width:"32" charset:"ascii" nullable:"true" list:"user" update:"user"` // Column(VARCHAR(32, charset='ascii'), nullable=True)
AioMode string `width:"32" charset:"ascii" nullable:"true" get:"user" update:"user"` // Column(VARCHAR(32, charset='ascii'), nullable=True)
Iops int `nullable:"true" default:"0"`
Bps int `nullable:"true" default:"0"` // Mb
Mountpoint string `width:"256" charset:"utf8" nullable:"true" get:"user"` // Column(VARCHAR(256, charset='utf8'), nullable=True)
@@ -169,6 +171,8 @@ func (self *SGuestdisk) GetJsonDescAtHost(host *SHost) jsonutils.JSONObject {
desc.Add(jsonutils.NewString(self.Driver), "driver")
desc.Add(jsonutils.NewString(self.CacheMode), "cache_mode")
desc.Add(jsonutils.NewString(self.AioMode), "aio_mode")
desc.Add(jsonutils.NewInt(int64(self.Iops)), "iops")
desc.Add(jsonutils.NewInt(int64(self.Bps)), "bps")
desc.Add(jsonutils.NewInt(int64(disk.DiskSize)), "size")
templateId := disk.GetTemplateId()
if len(templateId) > 0 {
@@ -236,6 +240,8 @@ func (self *SGuestdisk) GetDetailedJson() *jsonutils.JSONDict {
desc.Add(jsonutils.NewString(self.AioMode), "aio_mode")
desc.Add(jsonutils.NewString(storage.MediumType), "medium_type")
desc.Add(jsonutils.NewString(storage.StorageType), "storage_type")
desc.Add(jsonutils.NewInt(int64(self.Iops)), "iops")
desc.Add(jsonutils.NewInt(int64(self.Bps)), "bps")
imageId := disk.GetTemplateId()
if len(imageId) > 0 {
@@ -19,9 +19,11 @@ import (
"fmt"
"yunion.io/x/jsonutils"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/compute/models"
"yunion.io/x/onecloud/pkg/util/logclient"
)
type GuestBlockIoThrottleTask struct {
@@ -38,17 +40,53 @@ func (self *GuestBlockIoThrottleTask) OnInit(ctx context.Context, obj db.IStanda
headers := self.GetTaskRequestHeader()
host := guest.GetHost()
self.SetStage("OnIoThrottle", nil)
_, err := host.Request(ctx, self.UserCred, "POST", url, headers, self.Params)
params := jsonutils.NewDict()
iops, _ := self.Params.Get("iops")
bps, _ := self.Params.Get("bps")
params.Set("iops", iops)
params.Set("bps", bps)
_, err := host.Request(ctx, self.UserCred, "POST", url, headers, params)
if err != nil {
self.SetStageFailed(ctx, err.Error())
self.OnIoThrottleFailed(ctx, guest, jsonutils.NewString(err.Error()))
}
}
func (self *GuestBlockIoThrottleTask) OnIoThrottle(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
guest.SetMetadata(ctx, "io-throttle", self.Params.String(), self.UserCred)
iops, _ := self.Params.Int("iops")
bps, _ := self.Params.Int("bps")
gds := guest.GetDisks()
for i := 0; i < len(gds); i++ {
db.Update(&gds[i], func() error {
gds[i].Iops = int(iops)
gds[i].Bps = int(bps)
return nil
})
}
guest.SetMetadata(ctx, "iops", iops, self.UserCred)
guest.SetMetadata(ctx, "bps", bps, self.UserCred)
db.OpsLog.LogEvent(guest, db.ACT_VM_IO_THROTTLE, "", self.UserCred)
logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_VM_IO_THROTTLE, "", self.UserCred, true)
self.SetStage("OnGuestSync", nil)
guest.StartSyncstatus(ctx, self.UserCred, self.Id)
}
func (self *GuestBlockIoThrottleTask) OnGuestSync(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
oldStatus, _ := self.Params.GetString("old_status")
if len(oldStatus) > 0 {
guest.SetStatus(self.UserCred, oldStatus, "on io throttle")
}
self.SetStageComplete(ctx, nil)
}
func (self *GuestBlockIoThrottleTask) OnGuestSyncFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
self.OnIoThrottleFailed(ctx, guest, data)
}
func (self *GuestBlockIoThrottleTask) OnIoThrottleFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
db.OpsLog.LogEvent(guest, db.ACT_VM_IO_THROTTLE_FAIL, data.String(), self.UserCred)
logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_VM_IO_THROTTLE, data.String(), self.UserCred, false)
guest.SetStatus(self.UserCred, api.VM_IO_THROTTLE_FAIL, data.String())
self.SetStageFailed(ctx, data.String())
}
+28 -2
View File
@@ -483,6 +483,7 @@ func (s *SGuestResumeTask) onStartRunning() {
s.OnResumeSyncMetadataInfo()
s.SyncStatus()
s.optimizeOom()
s.doBlockIoThrottle()
timeutils2.AddTimeout(time.Second*5, s.SetCgroup)
disksIdx := s.GetNeedMergeBackingFileDiskIndexs()
if len(disksIdx) > 0 {
@@ -494,6 +495,17 @@ func (s *SGuestResumeTask) onStartRunning() {
}
}
func (s *SGuestResumeTask) doBlockIoThrottle() {
disks, _ := s.Desc.GetArray("disks")
if len(disks) > 0 {
bps, _ := disks[0].Int("bps")
iops, _ := disks[0].Int("iops")
if bps > 0 || iops > 0 {
s.BlockIoThrottle(context.Background(), bps, iops)
}
}
}
func (s *SGuestResumeTask) startStreamDisks(disksIdx []int) {
s.startTime = time.Time{}
s.CleanStartupTask()
@@ -1190,15 +1202,29 @@ func (task *SGuestBlockIoThrottleTask) onBlockDriversSucc(res *jsonutils.JSONArr
task.doIoThrottle(drivers)
}
func (task *SGuestBlockIoThrottleTask) taskFail(reason string) {
if taskId := task.ctx.Value(appctx.APP_CONTEXT_KEY_TASK_ID); taskId != nil {
hostutils.TaskFailed(task.ctx, reason)
} else {
log.Errorln(reason)
}
}
func (task *SGuestBlockIoThrottleTask) taskComplete(data jsonutils.JSONObject) {
if taskId := task.ctx.Value(appctx.APP_CONTEXT_KEY_TASK_ID); taskId != nil {
hostutils.TaskComplete(task.ctx, data)
}
}
func (task *SGuestBlockIoThrottleTask) doIoThrottle(drivers []string) {
if len(drivers) == 0 {
hostutils.TaskComplete(task.ctx, nil)
task.taskComplete(nil)
} else {
driver := drivers[0]
drivers = drivers[1:]
_cb := func(res string) {
if len(res) > 0 {
hostutils.TaskFailed(task.ctx, res)
task.taskFail(res)
} else {
task.doIoThrottle(drivers)
}
+1 -1
View File
@@ -144,7 +144,7 @@ func (m *QmpMonitor) callBack(res *Response) {
go func() {
defer func() {
if r := recover(); r != nil {
log.Errorf("PANIC %v:\n%s", debug.Stack(), r)
log.Errorf("PANIC %s:\n%s", debug.Stack(), r)
}
}()
cb(res)
+1
View File
@@ -121,6 +121,7 @@ const (
ACT_CANCEL_SNAPSHOT_POLICY = "取消快照策略"
ACT_ATTACH_HOST = "关联宿主机"
ACT_DETACH_HOST = "取消关联宿主机"
ACT_VM_IO_THROTTLE = "虚拟机磁盘限速"
ACT_IMAGE_SAVE = "上传镜像"
ACT_IMAGE_PROBE = "镜像检测"