store: LatestJobByKind includes in-flight jobs (avoid maintenance double-fire)
Widen the SQL query to consider all statuses (queued, running, succeeded, failed, cancelled) rather than terminal-only. An in-flight prune that outlasts the 60s tick interval previously produced ErrNotFound, causing the ticker to anchor at now-24h and fire a second prune concurrently with the first. Update the doc comment and test: remove the "queued job filtered out" case, add assertions that a running job and a queued job are each returned as the latest.
This commit is contained in:
@@ -49,20 +49,41 @@ func TestLatestJobByKind(t *testing.T) {
|
||||
t.Errorf("want j-new, got %q", got.ID)
|
||||
}
|
||||
|
||||
// A queued job should be ignored — terminal-status filter.
|
||||
queuedAt := time.Now().UTC()
|
||||
// An in-flight running job must be returned — long-prune-suppresses-tick
|
||||
// scenario: if a prune runs >60s the next tick must not re-fire it.
|
||||
runningAt := time.Now().UTC()
|
||||
if err := s.CreateJob(ctx, Job{
|
||||
ID: "j-running", HostID: hostID, Kind: "forget",
|
||||
ActorKind: "system", CreatedAt: runningAt,
|
||||
}); err != nil {
|
||||
t.Fatalf("create running: %v", err)
|
||||
}
|
||||
if err := s.MarkJobStarted(ctx, "j-running", runningAt); err != nil {
|
||||
t.Fatalf("mark started: %v", err)
|
||||
}
|
||||
got2, err := s.LatestJobByKind(ctx, hostID, "forget")
|
||||
if err != nil {
|
||||
t.Fatalf("LatestJobByKind 2: %v", err)
|
||||
}
|
||||
if got2.ID != "j-running" {
|
||||
t.Errorf("in-flight running job must be returned; want j-running, got %q", got2.ID)
|
||||
}
|
||||
|
||||
// A queued (not-yet-started) job is also returned (it is newer than
|
||||
// j-running because CreatedAt is later).
|
||||
queuedAt := runningAt.Add(time.Millisecond)
|
||||
if err := s.CreateJob(ctx, Job{
|
||||
ID: "j-queued", HostID: hostID, Kind: "forget",
|
||||
ActorKind: "system", CreatedAt: queuedAt,
|
||||
}); err != nil {
|
||||
t.Fatalf("create queued: %v", err)
|
||||
}
|
||||
got2, err := s.LatestJobByKind(ctx, hostID, "forget")
|
||||
got3, err := s.LatestJobByKind(ctx, hostID, "forget")
|
||||
if err != nil {
|
||||
t.Fatalf("LatestJobByKind 2: %v", err)
|
||||
t.Fatalf("LatestJobByKind 3: %v", err)
|
||||
}
|
||||
if got2.ID != "j-new" {
|
||||
t.Errorf("queued job should be ignored; want j-new, got %q", got2.ID)
|
||||
if got3.ID != "j-queued" {
|
||||
t.Errorf("queued job must be returned as newest; want j-queued, got %q", got3.ID)
|
||||
}
|
||||
|
||||
// Different kind → ErrNotFound.
|
||||
|
||||
Reference in New Issue
Block a user