From e9f1e9d0f5f11cd697c5707208809def09415a83 Mon Sep 17 00:00:00 2001 From: King Date: Mon, 27 Jul 2026 20:34:30 +0800 Subject: [PATCH] fix strm faild Co-authored-by: Cursor --- internal/strm/service_schedule.go | 14 ++++++++------ internal/strm/service_schedule_test.go | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/internal/strm/service_schedule.go b/internal/strm/service_schedule.go index b5d35cb..3fdca88 100644 --- a/internal/strm/service_schedule.go +++ b/internal/strm/service_schedule.go @@ -117,13 +117,8 @@ func (s *Service) runTaskAsync(task *domain.StrmTask) { s.clearTaskRunState(task.ID, task.AccountID) s.mu.Unlock() }() - if parent == nil { - parent = context.Background() - } - runCtx, cancel := context.WithCancel(parent) + runCtx, cancel := taskRunContext(parent) defer cancel() - runCtx, timeoutCancel := context.WithTimeout(runCtx, 30*time.Minute) - defer timeoutCancel() s.mu.Lock() s.taskCancels[task.ID] = cancel s.mu.Unlock() @@ -206,6 +201,13 @@ func (s *Service) runTaskAsync(task *domain.StrmTask) { }() } +func taskRunContext(parent context.Context) (context.Context, context.CancelFunc) { + if parent == nil { + parent = context.Background() + } + return context.WithCancel(parent) +} + func (s *Service) updateScanPersist(taskID int64, patch domain.StrmScanPatch) error { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() diff --git a/internal/strm/service_schedule_test.go b/internal/strm/service_schedule_test.go index a54d869..dde7a6e 100644 --- a/internal/strm/service_schedule_test.go +++ b/internal/strm/service_schedule_test.go @@ -2,6 +2,7 @@ package strm import ( "context" + "errors" "io" "log/slog" "sync" @@ -77,3 +78,17 @@ func TestShouldRunCrossBusyCheckNoDeadlock(t *testing.T) { t.Fatal("shouldRun cross busy check deadlocked") } } + +func TestTaskRunContextHasNoFixedDeadline(t *testing.T) { + ctx, cancel := taskRunContext(context.Background()) + if _, ok := ctx.Deadline(); ok { + cancel() + t.Fatal("STRM 任务不应有固定执行期限") + } + + cancel() + <-ctx.Done() + if !errors.Is(ctx.Err(), context.Canceled) { + t.Fatalf("取消任务后错误 = %v,期望 context.Canceled", ctx.Err()) + } +}