fix(tasks): 任务队列 - 限制缓存回源并修复并发租约与过期写入

This commit is contained in:
ddCat committed 2026-09-06 00:28:45 +08:00
1 parent 1ff5e5cada
commit bf0c4454fa
23 files changed
+1098 -59

No files matched your search

+25 -5
View File
@@ -7,13 +7,15 @@ import (
"time"
"infinite-canvas/backend/internal/model"
"infinite-canvas/backend/internal/repository"
)
type taskTerminalRepositoryStub struct {
task *model.Task
taskError error
terminalCalls int
terminalError error
task *model.Task
taskError error
terminalCalls int
terminalError error
terminalConflict bool
}
func (r *taskTerminalRepositoryStub) Task(string) (*model.Task, error) {
@@ -27,8 +29,11 @@ func (r *taskTerminalRepositoryStub) Task(string) (*model.Task, error) {
return &copy, nil
}
func (r *taskTerminalRepositoryStub) UpdateTaskTerminalState(_ string, _ model.TaskStatus, status model.TaskStatus, stage string, errorText string, completedAt time.Time) (bool, error) {
func (r *taskTerminalRepositoryStub) UpdateTaskTerminalState(_ string, _ string, _ model.TaskStatus, status model.TaskStatus, stage string, errorText string, completedAt time.Time) (bool, error) {
r.terminalCalls++
if r.terminalConflict {
return false, nil
}
if r.terminalError != nil {
return false, r.terminalError
}
@@ -41,6 +46,21 @@ func (r *taskTerminalRepositoryStub) UpdateTaskTerminalState(_ string, _ model.T
return true, nil
}
func TestTaskTerminalConflictDoesNotRefundOrFinalize(t *testing.T) {
repo := &taskTerminalRepositoryStub{terminalConflict: true}
billing, replay := &taskTerminalBillingStub{}, &taskTerminalReplayStub{}
sessions, logger := &taskTerminalSessionStub{}, &taskTerminalLoggerStub{}
c := newTaskTerminalCoordinatorForTest(repo, billing, replay, sessions, logger, &taskTerminalOutputStub{})
task := &model.Task{ID: "task", LeaseOwner: "stale", Status: model.TaskStatusRunning}
err := c.handleExecutionFailure(task, errors.New("upstream failed"), false, false)
if !errors.Is(err, repository.ErrTaskStateConflict) {
t.Fatalf("missing conflict: %v", err)
}
if len(billing.refund)+len(billing.uncertain)+billing.settleCalls+len(replay.statuses)+len(sessions.messages) != 0 {
t.Fatal("stale worker performed terminal side effects")
}
}
type taskTerminalBillingStub struct {
uncertain []string
refund []string