module Dynflow::Action::WithBulkSubPlans

Constants

DEFAULT_BATCH_SIZE
PlanNextBatch

Public Instance Methods

batch(from, size) click to toggle source

Should return a slice of size items starting from item with index from

# File lib/dynflow/action/with_bulk_sub_plans.rb, line 10
def batch(from, size)
  raise NotImplementedError
end
batch_size() click to toggle source
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 57
def batch_size
  DEFAULT_BATCH_SIZE
end
cancel!(force = false) click to toggle source
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 77
def cancel!(force = false)
  # Count the not-yet-planned tasks as cancelled
  output[:cancelled_count] = total_count - output[:planned_count]
  if uses_concurrency_control
    # Tell the throttle limiter to cancel the tasks its managing
    world.throttle_limiter.cancel!(execution_plan_id)
  else
    # Just stop the tasks which were not started yet
    sub_plans(:state => 'planned').each { |sub_plan| sub_plan.update_state(:stopped) }
  end
  # Pass the cancel event to running sub plans if they can be cancelled
  sub_plans(:state => 'running').each { |sub_plan| sub_plan.cancel(force) if sub_plan.cancellable? }
  suspend
end
current_batch() click to toggle source

Returns the items in the current batch

# File lib/dynflow/action/with_bulk_sub_plans.rb, line 51
def current_batch
  start_position = output[:planned_count]
  size = start_position + batch_size > total_count ? total_count - start_position : batch_size
  batch(start_position, size)
end
increase_counts(planned, failed) click to toggle source
Calls superclass method
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 40
def increase_counts(planned, failed)
  super(planned, failed, false)
  output[:planned_count] += planned + failed
end
initiate() click to toggle source
Calls superclass method
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 33
def initiate
  output[:planned_count] = 0
  output[:cancelled_count] = 0
  output[:total_count] = total_count
  super
end
on_planning_finished() click to toggle source
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 29
def on_planning_finished
  suspend
end
run(event = nil) click to toggle source
Calls superclass method Dynflow::Action::Cancellable#run
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 16
def run(event = nil)
  if event === PlanNextBatch
    if can_spawn_next_batch?
      spawn_plans
      suspend
    else
      on_planning_finished
    end
  else
    super
  end
end
run_progress() click to toggle source

The same logic as in Action::WithSubPlans, but calculated using the expected total count

# File lib/dynflow/action/with_bulk_sub_plans.rb, line 62
def run_progress
  if counts_set? && total_count > 0
    sum = output.values_at(:success_count, :cancelled_count, :failed_count).reduce(:+)
    sum.to_f / total_count
  else
    0.1
  end
end
spawn_plans() click to toggle source
Calls superclass method
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 71
def spawn_plans
  super
ensure
  plan_event(PlanNextBatch)
end
total_count() click to toggle source

Should return the expected total count of tasks

# File lib/dynflow/action/with_bulk_sub_plans.rb, line 46
def total_count
  raise NotImplementedError
end

Private Instance Methods

can_spawn_next_batch?() click to toggle source
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 98
def can_spawn_next_batch?
  remaining_count > 0
end
done?() click to toggle source
Calls superclass method
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 94
def done?
  !can_spawn_next_batch? && super
end
remaining_count() click to toggle source
# File lib/dynflow/action/with_bulk_sub_plans.rb, line 102
def remaining_count
  total_count - output[:cancelled_count] - output[:planned_count]
end