fix(worker): 统一异步执行准入范围

Worker 执行阶段重建准入范围时遗漏 worker_capacity,导致已预留 River 槽的任务再次同步等待准入并占住执行槽。

调度、执行和候选切换统一复用 taskAdmissionScopes,确保异步任务始终携带同一全局 Worker 容量范围。

验证:Go 全量测试、runner race、go vet、迁移安全检查通过。
This commit is contained in:
2026-07-31 07:15:44 +08:00
parent 238798e47c
commit bfd1257db0
2 changed files with 27 additions and 17 deletions
+23 -15
View File
@@ -113,14 +113,10 @@ func (s *Service) buildTaskAdmissionPlan(ctx context.Context, task store.Gateway
if !available {
continue
}
scopes, groupID := s.admissionScopes(ctx, user, candidate)
if task.AsyncMode {
scopes, err = s.withAsyncWorkerCapacityScope(ctx, scopes)
if err != nil {
return taskAdmissionPlan{}, err
}
scopes, groupID, scopeErr := s.taskAdmissionScopes(ctx, task, user, candidate)
if scopeErr != nil {
return taskAdmissionPlan{}, scopeErr
}
scopes = acceptanceAdmissionScopes(task, scopes)
hasConcurrentLimit := false
for _, scope := range scopes {
if scope.ConcurrentLimit > 0 {
@@ -172,6 +168,23 @@ func (s *Service) withAsyncWorkerCapacityScope(ctx context.Context, scopes []sto
return out, nil
}
func (s *Service) taskAdmissionScopes(
ctx context.Context,
task store.GatewayTask,
user *auth.User,
candidate store.RuntimeModelCandidate,
) ([]store.AdmissionScope, string, error) {
scopes, groupID := s.admissionScopes(ctx, user, candidate)
if task.AsyncMode {
var err error
scopes, err = s.withAsyncWorkerCapacityScope(ctx, scopes)
if err != nil {
return nil, "", err
}
}
return acceptanceAdmissionScopes(task, scopes), groupID, nil
}
func acceptanceAdmissionScopes(task store.GatewayTask, scopes []store.AdmissionScope) []store.AdmissionScope {
if task.RunMode != "acceptance" && task.RunMode != "acceptance_canary" {
return scopes
@@ -357,15 +370,10 @@ func (s *Service) ensureCandidateAdmission(
body map[string]any,
candidate store.RuntimeModelCandidate,
) (store.TaskAdmissionResult, bool, error) {
scopes, groupID := s.admissionScopes(ctx, user, candidate)
if task.AsyncMode {
var err error
scopes, err = s.withAsyncWorkerCapacityScope(ctx, scopes)
if err != nil {
return store.TaskAdmissionResult{}, true, err
}
scopes, groupID, err := s.taskAdmissionScopes(ctx, task, user, candidate)
if err != nil {
return store.TaskAdmissionResult{}, true, err
}
scopes = acceptanceAdmissionScopes(task, scopes)
hasConcurrentLimit := false
for _, scope := range scopes {
if scope.ConcurrentLimit > 0 {