@@ -150,6 +150,19 @@ type Cloudbrain struct { | |||
Repo *Repository `xorm:"-"` | |||
BenchmarkTypeName string `xorm:"-"` | |||
BenchmarkTypeRankLink string `xorm:"-"` | |||
StartTime timeutil.TimeStamp | |||
EndTime timeutil.TimeStamp | |||
} | |||
func (task *Cloudbrain) ComputeDuration() int64 { | |||
if task.StartTime == 0 || task.EndTime == 0 { | |||
return 0 | |||
} | |||
d := task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix() | |||
if d < 0 { | |||
d = 0 | |||
} | |||
return d | |||
} | |||
type CloudbrainInfo struct { | |||
@@ -1019,6 +1032,7 @@ type GetTrainJobResult struct { | |||
NasShareAddr string `json:"nas_share_addr"` | |||
DatasetName string | |||
ModelMetricList string `json:"model_metric_list"` //列表里包含f1_score,recall,precision,accuracy,若有的话 | |||
StartTime int64 `json:"start_time"` //训练作业开始时间。 | |||
} | |||
type GetTrainJobLogResult struct { | |||
@@ -1327,13 +1341,13 @@ func GetCloudbrainByJobIDAndIsLatestVersion(jobID string, isLatestVersion string | |||
func GetCloudbrainsNeededStopByUserID(userID int64) ([]*Cloudbrain, error) { | |||
cloudBrains := make([]*Cloudbrain, 0) | |||
err := x.Cols("job_id", "status", "type", "job_type", "version_id").Where("user_id=? AND status !=?", userID, string(JobStopped)).Find(&cloudBrains) | |||
err := x.Cols("job_id", "status", "type", "job_type", "version_id", "start_time").Where("user_id=? AND status !=?", userID, string(JobStopped)).Find(&cloudBrains) | |||
return cloudBrains, err | |||
} | |||
func GetCloudbrainsNeededStopByRepoID(repoID int64) ([]*Cloudbrain, error) { | |||
cloudBrains := make([]*Cloudbrain, 0) | |||
err := x.Cols("job_id", "status", "type", "job_type", "version_id").Where("repo_id=? AND status !=?", repoID, string(JobStopped)).Find(&cloudBrains) | |||
err := x.Cols("job_id", "status", "type", "job_type", "version_id", "start_time").Where("repo_id=? AND status !=?", repoID, string(JobStopped)).Find(&cloudBrains) | |||
return cloudBrains, err | |||
} | |||
@@ -6,6 +6,7 @@ | |||
package repo | |||
import ( | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"net/http" | |||
"sort" | |||
"time" | |||
@@ -77,6 +78,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 { | |||
job.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) | |||
} | |||
} | |||
if result.JobStatus.State != string(models.JobWaiting) { | |||
@@ -2,6 +2,7 @@ package repo | |||
import ( | |||
"bufio" | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"encoding/json" | |||
"errors" | |||
"fmt" | |||
@@ -380,6 +381,9 @@ 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 { | |||
task.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) | |||
} | |||
err = models.UpdateJob(task) | |||
if err != nil { | |||
ctx.Data["error"] = err.Error() | |||
@@ -489,6 +493,8 @@ func CloudBrainStop(ctx *context.Context) { | |||
} | |||
task.Status = string(models.JobStopped) | |||
task.EndTime = timeutil.TimeStampNow() | |||
task.Duration = task.ComputeDuration() | |||
err = models.UpdateJob(task) | |||
if err != nil { | |||
log.Error("UpdateJob(%s) failed:%v", task.JobName, err, ctx.Data["msgID"]) | |||
@@ -582,6 +588,8 @@ func logErrorAndUpdateJobStatus(err error, taskInfo *models.Cloudbrain) { | |||
log.Warn("Failed to stop cloudBrain job:"+taskInfo.JobID, err) | |||
} else { | |||
taskInfo.Status = string(models.JobStopped) | |||
taskInfo.EndTime = timeutil.TimeStampNow() | |||
taskInfo.Duration = taskInfo.ComputeDuration() | |||
err = models.UpdateJob(taskInfo) | |||
if err != nil { | |||
log.Warn("UpdateJob failed", err) | |||
@@ -953,6 +961,13 @@ func SyncCloudbrainStatus() { | |||
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 { | |||
task.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) | |||
} | |||
//if task.Status == string(models.JobFailed) { | |||
// task.EndTime = timeutil.TimeStampNow() | |||
// task.Duration = task.ComputeDuration() | |||
//} | |||
err = models.UpdateJob(task) | |||
if err != nil { | |||
log.Error("UpdateJob(%s) failed:%v", task.JobName, err) | |||
@@ -973,6 +988,8 @@ func SyncCloudbrainStatus() { | |||
continue | |||
} | |||
task.Status = string(models.JobStopped) | |||
task.EndTime = timeutil.TimeStampNow() | |||
task.Duration = task.ComputeDuration() | |||
err = models.UpdateJob(task) | |||
if err != nil { | |||
log.Error("UpdateJob(%s) failed:%v", task.JobName, err) | |||
@@ -991,7 +1008,9 @@ func SyncCloudbrainStatus() { | |||
if result != nil { | |||
task.Status = result.Status | |||
if task.StartTime == 0 { | |||
task.StartTime = timeutil.TimeStamp(result.Lease.CreateTime / 1000) | |||
} | |||
err = models.UpdateJob(task) | |||
if err != nil { | |||
log.Error("UpdateJob(%s) failed:%v", task.JobName, err) | |||
@@ -1010,6 +1029,9 @@ func SyncCloudbrainStatus() { | |||
task.Duration = result.Duration | |||
task.TrainJobDuration = result.TrainJobDuration | |||
if task.StartTime == 0 { | |||
task.StartTime = timeutil.TimeStamp(result.StartTime) | |||
} | |||
if result.Duration != 0 { | |||
task.TrainJobDuration = util.AddZero(result.Duration/3600000) + ":" + util.AddZero(result.Duration%3600000/60000) + ":" + util.AddZero(result.Duration%60000/1000) | |||
@@ -2,6 +2,7 @@ package repo | |||
import ( | |||
"archive/zip" | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"encoding/json" | |||
"errors" | |||
"io" | |||
@@ -408,6 +409,10 @@ func NotebookManage(ctx *context.Context) { | |||
} | |||
task.Status = res.Status | |||
if task.Status == string(models.ModelArtsStopped) { | |||
task.EndTime = timeutil.TimeStampNow() | |||
task.Duration = task.ComputeDuration() | |||
} | |||
err = models.UpdateJob(task) | |||
if err != nil { | |||
log.Error("UpdateJob(%s) failed:%v", task.JobName, err.Error(), ctx.Data["MsgID"]) | |||