From ede138317fb7f47ec798ccacb75ade1db4c14bc7 Mon Sep 17 00:00:00 2001 From: Samuel N Cui Date: Fri, 22 Sep 2023 23:40:03 +0800 Subject: [PATCH] fix: restore job statistic display --- executor/job_restore_exe.go | 25 ++++++++++++++++++++----- frontend/src/pages/jobs.tsx | 36 ++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/executor/job_restore_exe.go b/executor/job_restore_exe.go index 3cf4fc2..f6f77bb 100644 --- a/executor/job_restore_exe.go +++ b/executor/job_restore_exe.go @@ -161,8 +161,8 @@ func (a *jobRestoreExecutor) restoreTape(ctx context.Context, device string) (re expects := lo.Map(a.state.Tapes, func(t *entity.RestoreTape, _ int) string { return t.Barcode }) return fmt.Errorf("unexpected tape barcode in library, has= '%s' expect= %v", barcode, expects) } - if restoreTape.Status != entity.CopyStatus_PENDING { - return fmt.Errorf("unexpected restore tape state status, has= '%s' expect= '%s'", restoreTape.Status, entity.CopyStatus_PENDING) + if restoreTape.Status == entity.CopyStatus_SUBMITED { + return fmt.Errorf("unexpected restore tape state status, tape is restored, status= '%s'", restoreTape.Status) } tape, err := a.exe.lib.GetTape(ctx, restoreTape.TapeId) @@ -251,7 +251,7 @@ func (a *jobRestoreExecutor) restoreTape(ctx context.Context, device string) (re case "finished": a.logger.WithContext(ctx).Infof("file '%s' copy finished, size= %d", src.RealPath(), job.Size) - targetStatus = entity.CopyStatus_SUBMITED + targetStatus = entity.CopyStatus_STAGED if len(job.FailTargets) > 0 { targetStatus = entity.CopyStatus_FAILED } @@ -292,16 +292,31 @@ func (a *jobRestoreExecutor) restoreTape(ctx context.Context, device string) (re targetFile.Status = targetStatus if _, err := a.exe.SaveJob(ctx, a.job); err != nil { - logrus.WithContext(ctx).Infof("save job for update file fail, name= %s", job.Base+path.Join(job.Path...)) + a.logger.WithContext(ctx).Infof("save job for update file fail, name= %s", job.Base+path.Join(job.Path...)) } return } })) + restoreTape.Status = entity.CopyStatus_RUNNING + if _, err := a.exe.SaveJob(tools.WithoutTimeout(ctx), a.job); err != nil { + a.logger.WithContext(ctx).Infof("save job for submit tape fail, barcode= %s", restoreTape.Barcode) + } + defer func() { restoreTape.Status = entity.CopyStatus_SUBMITED + for _, file := range restoreTape.Files { + if file.Status == entity.CopyStatus_STAGED { + file.Status = entity.CopyStatus_SUBMITED + } + + if file.Status != entity.CopyStatus_SUBMITED { + restoreTape.Status = entity.CopyStatus_FAILED + } + } + if _, err := a.exe.SaveJob(tools.WithoutTimeout(ctx), a.job); err != nil { - logrus.WithContext(ctx).Infof("save job for submit tape fail, barcode= %s", restoreTape.Barcode) + a.logger.WithContext(ctx).Infof("save job for submit tape fail, barcode= %s", restoreTape.Barcode) } }() diff --git a/frontend/src/pages/jobs.tsx b/frontend/src/pages/jobs.tsx index 5f4efac..7ca2784 100644 --- a/frontend/src/pages/jobs.tsx +++ b/frontend/src/pages/jobs.tsx @@ -271,12 +271,12 @@ const ArchiveCard = ({ { name: "Current Speed", value: display?.speed ? `${formatFilesize(display?.speed)}/s` : "--" }, { name: "Average Speed", value: !isNaN(avgSpeed) ? `${formatFilesize(avgSpeed)}/s` : "--" }, { name: "Estimated Time", value: !isNaN(avgSpeed) ? format(((totalBytes - copyedBytes) * 1000) / avgSpeed) : "--" }, - { name: "Total Files", value: totalFiles }, - { name: "Total Bytes", value: formatFilesize(totalBytes) }, - { name: "Submited Files", value: submitedFiles }, - { name: "Submited Bytes", value: formatFilesize(submitedBytes) }, { name: "Copyed Files", value: copyedFiles }, { name: "Copyed Bytes", value: formatFilesize(copyedBytes) }, + { name: "Submited Files", value: submitedFiles }, + { name: "Submited Bytes", value: formatFilesize(submitedBytes) }, + { name: "Total Files", value: totalFiles }, + { name: "Total Bytes", value: formatFilesize(totalBytes) }, ]; return [fields, progress]; @@ -394,23 +394,27 @@ const RestoreCard = ({ }): JSX.Element => { const [fields, progress] = useMemo(() => { const totalFiles = state.tapes.reduce((count, tape) => count + tape.files.length, 0); - let submitedFiles = 0, - submitedBytes = 0, + let successFiles = 0, + successBytes = 0, + copyedFiles = Number(display?.copyedFiles || 0n), + copyedBytes = Number(display?.copyedBytes || 0n), totalBytes = 0; for (const tape of state.tapes) { for (const file of tape.files) { totalBytes += Number(file.size); - if (file.status !== CopyStatus.SUBMITED) { - continue; + + if (file.status === CopyStatus.SUBMITED || file.status === CopyStatus.STAGED) { + successFiles++; + successBytes += Number(file.size); } - submitedFiles++; - submitedBytes += Number(file.size); + if (file.status === CopyStatus.SUBMITED) { + copyedFiles++; + copyedBytes += Number(file.size); + } } } - const copyedFiles = submitedFiles + Number(display?.copyedFiles || 0n); - const copyedBytes = submitedBytes + Number(display?.copyedBytes || 0n); const avgSpeed = (() => { if (!display || !display.copyedBytes || !display.startTime) { return NaN; @@ -430,12 +434,12 @@ const RestoreCard = ({ { name: "Current Speed", value: display?.speed ? `${formatFilesize(display?.speed)}/s` : "--" }, { name: "Average Speed", value: !isNaN(avgSpeed) ? `${formatFilesize(avgSpeed)}/s` : "--" }, { name: "Estimated Time", value: !isNaN(avgSpeed) ? format(((totalBytes - copyedBytes) * 1000) / avgSpeed) : "--" }, - { name: "Total Files", value: totalFiles }, - { name: "Total Bytes", value: formatFilesize(totalBytes) }, - { name: "Submited Files", value: submitedFiles }, - { name: "Submited Bytes", value: formatFilesize(submitedBytes) }, { name: "Copyed Files", value: copyedFiles }, { name: "Copyed Bytes", value: formatFilesize(copyedBytes) }, + { name: "Success Files", value: successFiles }, + { name: "Success Bytes", value: formatFilesize(successBytes) }, + { name: "Total Files", value: totalFiles }, + { name: "Total Bytes", value: formatFilesize(totalBytes) }, ]; return [fields, progress];