class Dynflow::Coordinator

Attributes

adapter[R]

Public Class Methods

new(coordinator_adapter) click to toggle source
# File lib/dynflow/coordinator.rb, line 243
def initialize(coordinator_adapter)
  @adapter = coordinator_adapter
end

Public Instance Methods

acquire(lock, &block) click to toggle source
# File lib/dynflow/coordinator.rb, line 247
def acquire(lock, &block)
  Type! lock, Lock
  lock.validate!
  adapter.create_record(lock)
  if block
    begin
      block.call
    ensure
      release(lock)
    end
  end
rescue DuplicateRecordError => e
  raise LockError.new(e.record)
end
clean_orphaned_locks() click to toggle source
# File lib/dynflow/coordinator.rb, line 325
def clean_orphaned_locks
  cleanup_classes = [LockByWorld]
  ret = []
  cleanup_classes.each do |cleanup_class|
    valid_owner_ids = cleanup_class.valid_owner_ids(self)
    valid_classes = cleanup_class.valid_classes.map(&:name)
    orphaned_locks = find_locks(class: valid_classes, exclude_owner_id: valid_owner_ids)
    # reloading the valid owner ids to avoid race conditions
    valid_owner_ids = cleanup_class.valid_owner_ids(self)
    orphaned_locks.each do |lock|
      unless valid_owner_ids.include?(lock.owner_id)
        release(lock)
        ret << lock
      end
    end
  end
  return ret
end
create_record(record) click to toggle source
# File lib/dynflow/coordinator.rb, line 277
def create_record(record)
  Type! record, Record
  adapter.create_record(record)
end
deactivate_world(world) click to toggle source
# File lib/dynflow/coordinator.rb, line 319
def deactivate_world(world)
  Type! world, Coordinator::ExecutorWorld
  world.active = false
  update_record(world)
end
delete_record(record) click to toggle source
# File lib/dynflow/coordinator.rb, line 287
def delete_record(record)
  Type! record, Record
  adapter.delete_record(record)
end
delete_world(world) click to toggle source
# File lib/dynflow/coordinator.rb, line 313
def delete_world(world)
  Type! world, Coordinator::ClientWorld, Coordinator::ExecutorWorld
  release_by_owner("world:#{world.id}")
  delete_record(world)
end
find_locks(filter_options) click to toggle source
# File lib/dynflow/coordinator.rb, line 271
def find_locks(filter_options)
  adapter.find_records(filter_options).map do |lock_data|
    Lock.from_hash(lock_data)
  end
end
find_records(filter) click to toggle source
# File lib/dynflow/coordinator.rb, line 292
def find_records(filter)
  adapter.find_records(filter).map do |record_data|
    Record.from_hash(record_data)
  end
end
find_worlds(active_executor_only = false, filters = {}) click to toggle source
# File lib/dynflow/coordinator.rb, line 298
def find_worlds(active_executor_only = false, filters = {})
  ret = find_records(filters.merge(class: Coordinator::ExecutorWorld.name))
  if active_executor_only
    ret = ret.select(&:active?)
  else
    ret.concat(find_records(filters.merge(class: Coordinator::ClientWorld.name)))
  end
  ret
end
register_world(world) click to toggle source
# File lib/dynflow/coordinator.rb, line 308
def register_world(world)
  Type! world, Coordinator::ClientWorld, Coordinator::ExecutorWorld
  create_record(world)
end
release(lock) click to toggle source
# File lib/dynflow/coordinator.rb, line 262
def release(lock)
  Type! lock, Lock
  adapter.delete_record(lock)
end
release_by_owner(owner_id) click to toggle source
# File lib/dynflow/coordinator.rb, line 267
def release_by_owner(owner_id)
  find_locks(owner_id: owner_id).map { |lock| release(lock) }
end
update_record(record) click to toggle source
# File lib/dynflow/coordinator.rb, line 282
def update_record(record)
  Type! record, Record
  adapter.update_record(record)
end