|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package mq
-
- import (
- "time"
-
- "gitlink.org.cn/cloudream/common/consts/errorcode"
- "gitlink.org.cn/cloudream/common/pkgs/logger"
- "gitlink.org.cn/cloudream/common/pkgs/mq"
- mytask "gitlink.org.cn/cloudream/storage/agent/internal/task"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch"
- agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
- )
-
- // SetupIOPlan 设置I/O计划。
- // msg: 包含I/O计划信息的消息体。
- // 返回值: 成功时返回响应消息和成功标志,失败时返回错误代码和消息。
- func (svc *Service) SetupIOPlan(msg *agtmq.SetupIOPlan) (*agtmq.SetupIOPlanResp, *mq.CodeMessage) {
- err := svc.sw.SetupPlan(msg.Plan)
- if err != nil {
- logger.WithField("PlanID", msg.Plan.ID).Warnf("adding plan: %s", err.Error())
- return nil, mq.Failed(errorcode.OperationFailed, "adding plan failed")
- }
-
- return mq.ReplyOK(agtmq.NewSetupIOPlanResp())
- }
-
- // StartIOPlan 启动I/O计划。
- // msg: 包含I/O计划ID的消息体。
- // 返回值: 成功时返回任务ID和成功标志,失败时返回错误代码和消息。
- func (svc *Service) StartIOPlan(msg *agtmq.StartIOPlan) (*agtmq.StartIOPlanResp, *mq.CodeMessage) {
- tsk := svc.taskManager.StartNew(mytask.NewExecuteIOPlan(msg.PlanID))
- return mq.ReplyOK(agtmq.NewStartIOPlanResp(tsk.ID()))
- }
-
- // WaitIOPlan 等待I/O计划完成。
- // msg: 包含任务ID和等待超时时间的消息体。
- // 返回值: 成功时返回任务完成状态、错误消息和结果,失败时返回错误代码和消息。
- func (svc *Service) WaitIOPlan(msg *agtmq.WaitIOPlan) (*agtmq.WaitIOPlanResp, *mq.CodeMessage) {
- tsk := svc.taskManager.FindByID(msg.TaskID)
- if tsk == nil {
- return nil, mq.Failed(errorcode.TaskNotFound, "task not found")
- }
-
- if msg.WaitTimeoutMs == 0 {
- tsk.Wait()
-
- errMsg := ""
- if tsk.Error() != nil {
- errMsg = tsk.Error().Error()
- }
-
- planTsk := tsk.Body().(*mytask.ExecuteIOPlan)
- return mq.ReplyOK(agtmq.NewWaitIOPlanResp(true, errMsg, planTsk.Result))
-
- } else {
- if tsk.WaitTimeout(time.Duration(msg.WaitTimeoutMs) * time.Millisecond) {
-
- errMsg := ""
- if tsk.Error() != nil {
- errMsg = tsk.Error().Error()
- }
-
- planTsk := tsk.Body().(*mytask.ExecuteIOPlan)
- return mq.ReplyOK(agtmq.NewWaitIOPlanResp(true, errMsg, planTsk.Result))
- }
-
- return mq.ReplyOK(agtmq.NewWaitIOPlanResp(false, "", ioswitch.PlanResult{}))
- }
- }
-
- // CancelIOPlan 取消I/O计划。
- // msg: 包含要取消的I/O计划ID的消息体。
- // 返回值: 成功时返回响应消息和成功标志,失败时返回错误代码和消息。
- func (svc *Service) CancelIOPlan(msg *agtmq.CancelIOPlan) (*agtmq.CancelIOPlanResp, *mq.CodeMessage) {
- svc.sw.CancelPlan(msg.PlanID)
- return mq.ReplyOK(agtmq.NewCancelIOPlanResp())
- }
|