Sha256: b9edd2b313a02aefbc58591fd21c83c700222b0299fc027dd39245d9cfcda57d

Contents?: true

Size: 1.19 KB

Versions: 25

Compression:

Stored size: 1.19 KB

Contents

# frozen_string_literal: true
module Dynflow
  class Action
    module Singleton
      def self.included(base)
        base.middleware.use ::Dynflow::Middleware::Common::Singleton
      end

      def validate_singleton_lock!
        singleton_lock! unless holds_singleton_lock?
      end

      def singleton_lock!
        world.coordinator.acquire(singleton_lock)
      rescue Dynflow::Coordinator::LockError
        fail "Action #{self.class.name} is already active"
      end

      def singleton_unlock!
        world.coordinator.release(singleton_lock) if holds_singleton_lock?
      end

      def holds_singleton_lock?
        # Get locks for this action, there should be none or one
        lock_filter = singleton_lock_class.unique_filter(self.class.name)
        present_locks = world.coordinator.find_locks lock_filter
        !present_locks.empty? && present_locks.first.owner_id == execution_plan_id
      end

      def singleton_lock_class
        ::Dynflow::Coordinator::SingletonActionLock
      end

      def singleton_lock
        singleton_lock_class.new(self.class.name, execution_plan_id)
      end

      def error!(*args)
        singleton_unlock!
        super
      end
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
dynflow-1.8.2 lib/dynflow/action/singleton.rb
dynflow-1.8.1 lib/dynflow/action/singleton.rb
dynflow-1.8.0 lib/dynflow/action/singleton.rb
dynflow-1.7.0 lib/dynflow/action/singleton.rb
dynflow-1.6.11 lib/dynflow/action/singleton.rb
dynflow-1.6.10 lib/dynflow/action/singleton.rb
dynflow-1.6.8 lib/dynflow/action/singleton.rb
dynflow-1.6.7 lib/dynflow/action/singleton.rb
dynflow-1.6.6 lib/dynflow/action/singleton.rb
dynflow-1.6.5 lib/dynflow/action/singleton.rb
dynflow-1.6.4 lib/dynflow/action/singleton.rb
dynflow-1.6.3 lib/dynflow/action/singleton.rb
dynflow-1.6.2 lib/dynflow/action/singleton.rb
dynflow-1.6.1 lib/dynflow/action/singleton.rb
dynflow-1.4.9 lib/dynflow/action/singleton.rb
dynflow-1.4.8 lib/dynflow/action/singleton.rb
dynflow-1.5.0 lib/dynflow/action/singleton.rb
dynflow-1.4.7 lib/dynflow/action/singleton.rb
dynflow-1.4.6 lib/dynflow/action/singleton.rb
dynflow-1.4.5 lib/dynflow/action/singleton.rb