fix(worker): 统一异步执行准入范围
Worker 执行阶段重建准入范围时遗漏 worker_capacity,导致已预留 River 槽的任务再次同步等待准入并占住执行槽。 调度、执行和候选切换统一复用 taskAdmissionScopes,确保异步任务始终携带同一全局 Worker 容量范围。 验证:Go 全量测试、runner race、go vet、迁移安全检查通过。
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user