Class: Pindo::TaskSystem::DependencyChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/pindo/module/task/core/dependency_checker.rb

Overview

DependencyChecker - 依赖检查器

职责:

  • 检查任务是否可以执行

  • 检查依赖状态

  • 检查资源可用性

  • 标记任务失败或取消

Instance Method Summary collapse

Constructor Details

#initialize(queue, resource_lock_manager) ⇒ DependencyChecker



13
14
15
16
# File 'lib/pindo/module/task/core/dependency_checker.rb', line 13

def initialize(queue, resource_lock_manager)
  @queue = queue
  @resource_lock_manager = resource_lock_manager
end

Instance Method Details

#all_pending_blocked?Boolean

检查是否所有待执行任务都因依赖问题无法执行



92
93
94
# File 'lib/pindo/module/task/core/dependency_checker.rb', line 92

def all_pending_blocked?
  @queue.all_pending? { |t| check_dependencies(t) != :ready }
end

#can_execute?(task) ⇒ Boolean

判断任务是否可以执行(检查依赖和资源)



42
43
44
# File 'lib/pindo/module/task/core/dependency_checker.rb', line 42

def can_execute?(task)
  dependencies_satisfied?(task) && check_resources_available?(task)
end

#check_dependencies(task) ⇒ Symbol

检查依赖状态



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/pindo/module/task/core/dependency_checker.rb', line 59

def check_dependencies(task)
  return :ready if task.dependencies.empty?

  task.dependencies.each do |dep_id|
    dep_task = @queue.find(dep_id)

    # 依赖任务不存在
    unless dep_task
      Funlog.error("[依赖检查] 任务 #{task.name}: 依赖任务 #{dep_id} 不存在")
      return :failed
    end

    # 检查依赖任务状态
    case dep_task.status
    when TaskStatus::SUCCESS
      next  # 这个依赖已完成
    when TaskStatus::FAILED
      Funlog.error("[依赖检查] 任务 #{task.name}: 依赖任务 #{dep_task.name} 失败 (状态: #{dep_task.status})")
      return :failed  # 依赖失败
    when TaskStatus::CANCELLED
      Funlog.warning("[依赖检查] 任务 #{task.name}: 依赖任务 #{dep_task.name} 被取消 (状态: #{dep_task.status})")
      return :cancelled  # 依赖被取消
    else
      # Funlog.info("[依赖检查] 任务 #{task.name}: 依赖任务 #{dep_task.name} 未完成 (状态: #{dep_task.status})")
      return :waiting  # 依赖未完成
    end
  end

  :ready  # 所有依赖都成功完成
end

#check_resources_available?(task) ⇒ Boolean

检查资源是否可用



49
50
51
52
53
54
# File 'lib/pindo/module/task/core/dependency_checker.rb', line 49

def check_resources_available?(task)
  resource_names = task.required_resources
  return true if resource_names.nil? || resource_names.empty?

  @resource_lock_manager.available?(resource_names)
end

#dependencies_satisfied?(task) ⇒ Boolean

判断任务依赖是否满足(不检查资源)



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/pindo/module/task/core/dependency_checker.rb', line 21

def dependencies_satisfied?(task)
  # 检查依赖状态
  dependency_check = check_dependencies(task)

  case dependency_check
  when :failed
    mark_task_failed(task, "依赖任务失败")
    false
  when :cancelled
    mark_task_cancelled(task, "依赖任务被取消")
    false
  when :waiting
    false  # 依赖未完成,继续等待
  else
    true  # 依赖已满足
  end
end