From c51ca5e0fa6b4928e18a152d1ba0ef77bb903699 Mon Sep 17 00:00:00 2001 From: chenyifan01 Date: Thu, 31 Mar 2022 11:50:39 +0800 Subject: [PATCH] #1654 fix bug --- models/cloudbrain.go | 24 ++++++++++- routers/api/v1/repo/cloudbrain.go | 13 +----- routers/repo/cloudbrain.go | 41 +++++++------------ templates/repo/cloudbrain/benchmark/show.tmpl | 16 +++++++- templates/repo/cloudbrain/show.tmpl | 12 +++++- 5 files changed, 61 insertions(+), 45 deletions(-) diff --git a/models/cloudbrain.go b/models/cloudbrain.go index 17761a1dc..72dc4171b 100755 --- a/models/cloudbrain.go +++ b/models/cloudbrain.go @@ -162,7 +162,9 @@ func (task *Cloudbrain) ComputeAndSetDuration() { if task.StartTime == 0 { d = 0 } else if task.EndTime == 0 { - d = time.Now().Unix() - task.StartTime.AsTime().Unix() + if !task.IsTerminal() { + d = time.Now().Unix() - task.StartTime.AsTime().Unix() + } } else { d = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix() } @@ -174,6 +176,11 @@ func (task *Cloudbrain) ComputeAndSetDuration() { task.TrainJobDuration = ConvertDurationToStr(d) } +func (task *Cloudbrain) IsTerminal() bool { + status := task.Status + return status == string(ModelArtsTrainJobCompleted) || status == string(ModelArtsTrainJobFailed) || status == string(ModelArtsTrainJobKilled) || status == string(ModelArtsStopped) || status == string(JobStopped) || status == string(JobFailed) || status == string(JobSucceeded) +} + func ConvertDurationToStr(duration int64) string { if duration == 0 { return DURATION_STR_ZERO @@ -193,6 +200,19 @@ func IsCloudBrainOneDebugJobTerminal(status string) bool { return status == string(JobStopped) || status == string(JobFailed) || status == string(JobSucceeded) } +func ParseAndSetDurationFromCloudBrainOne(result JobResultPayload, task *Cloudbrain) { + isActivated := result.JobStatus.CreatedTime > 0 + if task.StartTime == 0 && isActivated { + task.StartTime = timeutil.TimeStamp(result.JobStatus.CreatedTime / 1000) + } + if task.EndTime == 0 && IsCloudBrainOneDebugJobTerminal(task.Status) && isActivated { + if result.JobStatus.CompletedTime > 0 { + task.EndTime = timeutil.TimeStamp(result.JobStatus.CompletedTime / 1000) + } + } + task.ComputeAndSetDuration() +} + type CloudbrainInfo struct { Cloudbrain `xorm:"extends"` User `xorm:"extends"` @@ -360,7 +380,7 @@ type JobResultPayload struct { AppProgress string `json:"appProgress"` AppTrackingURL string `json:"appTrackingUrl"` AppLaunchedTime int64 `json:"appLaunchedTime"` - AppCompletedTime interface{} `json:"appCompletedTime"` + AppCompletedTime int64 `json:"appCompletedTime"` AppExitCode int `json:"appExitCode"` AppExitDiagnostics string `json:"appExitDiagnostics"` AppExitType interface{} `json:"appExitType"` diff --git a/routers/api/v1/repo/cloudbrain.go b/routers/api/v1/repo/cloudbrain.go index f6fbdc286..8fdab372b 100755 --- a/routers/api/v1/repo/cloudbrain.go +++ b/routers/api/v1/repo/cloudbrain.go @@ -6,7 +6,6 @@ package repo import ( - "code.gitea.io/gitea/modules/timeutil" "net/http" "sort" "time" @@ -77,20 +76,10 @@ func GetCloudbrainTask(ctx *context.APIContext) { job.ContainerIp = taskRes.TaskStatuses[0].ContainerIP job.ContainerID = taskRes.TaskStatuses[0].ContainerID job.Status = taskRes.TaskStatuses[0].State - if job.StartTime == 0 && !taskRes.TaskStatuses[0].StartAt.IsZero() { - job.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) - } } if result.JobStatus.State != string(models.JobWaiting) { - if job.EndTime == 0 && models.IsCloudBrainOneDebugJobTerminal(job.Status) { - if taskRes.TaskStatuses[0].FinishedAt.IsZero() { - job.EndTime = timeutil.TimeStampNow() - } else { - job.EndTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].FinishedAt.Unix()) - } - } - job.ComputeAndSetDuration() + models.ParseAndSetDurationFromCloudBrainOne(result, job) err = models.UpdateJob(job) if err != nil { log.Error("UpdateJob failed:", err) diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 921dba68a..d3201161b 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -376,9 +376,7 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName) { task.Status = taskRes.TaskStatuses[0].State task.ContainerID = taskRes.TaskStatuses[0].ContainerID task.ContainerIp = taskRes.TaskStatuses[0].ContainerIP - if task.StartTime == 0 && !taskRes.TaskStatuses[0].StartAt.IsZero() { - task.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) - } + models.ParseAndSetDurationFromCloudBrainOne(jobRes, task) err = models.UpdateJob(task) if err != nil { ctx.Data["error"] = err.Error() @@ -964,18 +962,7 @@ func SyncCloudbrainStatus() { taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{})) task.Status = taskRes.TaskStatuses[0].State if task.Status != string(models.JobWaiting) { - task.Duration = time.Now().Unix() - taskRes.TaskStatuses[0].StartAt.Unix() - if task.StartTime == 0 && !taskRes.TaskStatuses[0].StartAt.IsZero() { - task.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) - } - if task.EndTime == 0 && models.IsCloudBrainOneDebugJobTerminal(task.Status) { - if taskRes.TaskStatuses[0].FinishedAt.IsZero() { - task.EndTime = timeutil.TimeStampNow() - } else { - task.EndTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].FinishedAt.Unix()) - } - } - task.ComputeAndSetDuration() + models.ParseAndSetDurationFromCloudBrainOne(jobRes, task) err = models.UpdateJob(task) if err != nil { log.Error("UpdateJob(%s) failed:%v", task.JobName, err) @@ -1121,18 +1108,17 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) { continue } task.Status = taskRes.TaskStatuses[0].State - startTime := taskRes.TaskStatuses[0].StartAt.Unix() - endTime := taskRes.TaskStatuses[0].FinishedAt.Unix() - log.Info("task startTime = %v endTime= %v ,jobId=%d", startTime, endTime, task.ID) - if startTime > 0 { - task.StartTime = timeutil.TimeStamp(startTime) - } else { - task.StartTime = task.CreatedUnix - } - if endTime > 0 { - task.EndTime = timeutil.TimeStamp(endTime) + log.Info("task startTime = %v endTime= %v ,jobId=%d", jobRes.JobStatus.StartTime, jobRes.JobStatus.EndTime, task.ID) + if jobRes.JobStatus.CreatedTime > 0 { + task.StartTime = timeutil.TimeStamp(jobRes.JobStatus.CreatedTime / 1000) + if jobRes.JobStatus.CompletedTime > 0 { + task.EndTime = timeutil.TimeStamp(jobRes.JobStatus.CompletedTime / 1000) + } else { + task.EndTime = task.UpdatedUnix + } } else { - task.EndTime = task.UpdatedUnix + task.StartTime = 0 + task.EndTime = 0 } if task.EndTime < task.StartTime { @@ -1141,7 +1127,8 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) { task.StartTime = task.EndTime task.EndTime = st } - task.ComputeAndSetDuration() + task.Duration = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix() + task.TrainJobDuration = models.ConvertDurationToStr(task.Duration) err = models.UpdateJob(task) if err != nil { log.Error("UpdateJob(%s) failed:%v", task.JobName, err) diff --git a/templates/repo/cloudbrain/benchmark/show.tmpl b/templates/repo/cloudbrain/benchmark/show.tmpl index 3c8f91528..109fb195f 100755 --- a/templates/repo/cloudbrain/benchmark/show.tmpl +++ b/templates/repo/cloudbrain/benchmark/show.tmpl @@ -196,7 +196,13 @@ td, th {
- {{TimeSinceUnix1 .CreatedUnix}} + + {{if not (eq .StartTime 0)}} + {{TimeSinceUnix1 .StartTime}} + {{else}} + {{TimeSinceUnix1 .CreatedUnix}} + {{end}} + {{$.i18n.Tr "repo.modelarts.status"}}: {{.Status}} @@ -252,7 +258,13 @@ td, th {
- {{TimeSinceUnix1 .CreatedUnix}} + + {{if not (eq .StartTime 0)}} + {{TimeSinceUnix1 .StartTime}} + {{else}} + {{TimeSinceUnix1 .CreatedUnix}} + {{end}} +
diff --git a/templates/repo/cloudbrain/show.tmpl b/templates/repo/cloudbrain/show.tmpl index d1e736c20..1e234e094 100755 --- a/templates/repo/cloudbrain/show.tmpl +++ b/templates/repo/cloudbrain/show.tmpl @@ -74,11 +74,19 @@ 开始时间 - {{.JobStatus.StartTime}} + {{if not (eq $.task.StartTime 0)}} + {{TimeSinceUnix1 $.task.StartTime}} + {{else}} + 无 + {{end}} 结束时间 - {{.JobStatus.EndTime}} + {{if not (eq $.task.EndTime 0)}} + {{TimeSinceUnix1 $.task.EndTime}} + {{else}} + 无 + {{end}} ExitCode