Feature 04 task 5: Async job runner and GET /api/v1/jobs/{id} #29
@@ -41,7 +41,9 @@ const (
|
|||||||
// Failure codes the runner stores itself. A kind cannot declare them.
|
// Failure codes the runner stores itself. A kind cannot declare them.
|
||||||
const (
|
const (
|
||||||
// CodeInterrupted is the error of a job a previous process left running.
|
// CodeInterrupted is the error of a job a previous process left running.
|
||||||
CodeInterrupted = "interrupted"
|
// It is fixed framework text, not a snake-case code, so no kind can
|
||||||
|
// declare it.
|
||||||
|
CodeInterrupted = "interrupted by restart"
|
||||||
// CodeInternal is the error of a job whose handler failed with anything
|
// CodeInternal is the error of a job whose handler failed with anything
|
||||||
// but a *Failure with a code its kind declared, or whose payload or
|
// but a *Failure with a code its kind declared, or whose payload or
|
||||||
// result could not be encoded. The underlying error is neither stored
|
// result could not be encoded. The underlying error is neither stored
|
||||||
@@ -152,7 +154,7 @@ func Register[P any, R Public](r *Runner, kind string, h Handler[P, R], failureC
|
|||||||
if !codePattern.MatchString(code) {
|
if !codePattern.MatchString(code) {
|
||||||
return nil, fmt.Errorf("jobs: register %q: failure code %q is not lower-case snake case", kind, code)
|
return nil, fmt.Errorf("jobs: register %q: failure code %q is not lower-case snake case", kind, code)
|
||||||
}
|
}
|
||||||
if code == CodeInterrupted || code == CodeInternal || code == CodeUnknownKind {
|
if code == CodeInternal || code == CodeUnknownKind {
|
||||||
return nil, fmt.Errorf("jobs: register %q: failure code %q is reserved for the runner", kind, code)
|
return nil, fmt.Errorf("jobs: register %q: failure code %q is reserved for the runner", kind, code)
|
||||||
}
|
}
|
||||||
declared[code] = true
|
declared[code] = true
|
||||||
|
|||||||
@@ -391,8 +391,8 @@ func TestRestartFailsInterruptedJobsAndRunsQueuedOnes(t *testing.T) {
|
|||||||
start(t, second)
|
start(t, second)
|
||||||
|
|
||||||
job := waitFor(t, second, interrupted, finished)
|
job := waitFor(t, second, interrupted, finished)
|
||||||
if job.Status != StatusFailed || job.Error == nil || *job.Error != CodeInterrupted {
|
if job.Status != StatusFailed || job.Error == nil || *job.Error != "interrupted by restart" {
|
||||||
t.Errorf("interrupted job = %+v, want failed with %q", job, CodeInterrupted)
|
t.Errorf("interrupted job = %+v, want failed with %q", job, "interrupted by restart")
|
||||||
}
|
}
|
||||||
if string(job.Result) != `{"done":1}` {
|
if string(job.Result) != `{"done":1}` {
|
||||||
t.Errorf("interrupted job result = %s, want the last partial result kept", job.Result)
|
t.Errorf("interrupted job result = %s, want the last partial result kept", job.Result)
|
||||||
|
|||||||
Reference in New Issue
Block a user