mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-19 02:37:24 +08:00
io throttle add log event
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -134,6 +134,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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -141,7 +141,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)
|
||||
|
||||
@@ -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 = "镜像检测"
|
||||
|
||||
Reference in New Issue
Block a user