class Dynflow::Rails::Configuration
Attributes
the size of db connection pool, if not set, it's calculated from the amount of workers in the pool
if true, the ForemanTasks::Concerns::ActionTriggering will make no effect. Useful for testing, where we mignt not want to execute the orchestration tied to the models.
the number of threads in the pool handling the execution
what rake tasks should run their own executor, not depending on the external one
set true if the executor runs externally (by default true in procution, othewise false)
set true if the executor runs externally (by default true in procution, othewise false)
what transaction adapater should be used, by default, it uses the ActiveRecord based adapter, expecting ActiveRecord is used as ORM in the application
Public Class Methods
# File lib/dynflow/rails/configuration.rb, line 35 def initialize self.pool_size = 5 self.remote = ::Rails.env.production? self.transaction_adapter = ::Dynflow::TransactionAdapters::ActiveRecord.new self.eager_load_paths = [] self.lazy_initialization = !::Rails.env.production? self.rake_tasks_with_executor = %w(db:migrate db:seed) @on_init = [] @on_executor_init = [] @post_executor_init = [] end
Public Instance Methods
# File lib/dynflow/rails/configuration.rb, line 106 def calculate_db_pool_size(world) return self.db_pool_size if self.db_pool_size base_value = 5 if defined?(::Sidekiq) Sidekiq.options[:concurrency] + base_value else world.config.queues.values.inject(base_value) do |pool_size, pool_options| pool_size += pool_options[:pool_size] end end end
To avoid pottential timeouts on db connection pool, make sure we have the pool bigger than the thread pool
# File lib/dynflow/rails/configuration.rb, line 121 def increase_db_pool_size(world = nil) if world.nil? warn 'Deprecated: using `increase_db_pool_size` outside of Dynflow code is not needed anymore' return end if increase_db_pool_size? db_pool_size = calculate_db_pool_size(world) ::ActiveRecord::Base.connection_pool.disconnect! config = ::ActiveRecord::Base.configurations[::Rails.env] config['pool'] = db_pool_size if config['pool'].to_i < db_pool_size ::ActiveRecord::Base.establish_connection(config) end end
# File lib/dynflow/rails/configuration.rb, line 98 def increase_db_pool_size? !::Rails.env.test? && (!remote? || sidekiq_worker?) end
# File lib/dynflow/rails/configuration.rb, line 78 def initialize_world(world_class = ::Dynflow::World) world_class.new(world_config) end
# File lib/dynflow/rails/configuration.rb, line 60 def on_init(executor = true, &block) destination = executor ? @on_executor_init : @on_init destination << block end
# File lib/dynflow/rails/configuration.rb, line 70 def post_executor_init(&block) @post_executor_init << block end
expose the queues definition to Rails
developers
# File lib/dynflow/rails/configuration.rb, line 154 def queues world_config.queues end
# File lib/dynflow/rails/configuration.rb, line 90 def rake_task_with_executor? return false unless defined?(::Rake) && ::Rake.respond_to?(:application) ::Rake.application.top_level_tasks.any? do |rake_task| rake_tasks_with_executor.include?(rake_task) end end
# File lib/dynflow/rails/configuration.rb, line 65 def run_on_init_hooks(executor, world) source = executor ? @on_executor_init : @on_init source.each { |init| init.call(world) } end
# File lib/dynflow/rails/configuration.rb, line 74 def run_post_executor_init_hooks(world) @post_executor_init.each { |init| init.call(world) } end
# File lib/dynflow/rails/configuration.rb, line 102 def sidekiq_worker? defined?(::Sidekiq) && ::Sidekiq.options[:queues].any? end
generates the options hash consumable by the Dynflow's world
# File lib/dynflow/rails/configuration.rb, line 137 def world_config @world_config ||= ::Dynflow::Config.new.tap do |config| config.auto_rescue = true config.logger_adapter = ::Dynflow::LoggerAdapters::Delegator.new(action_logger, dynflow_logger) config.pool_size = self.pool_size config.persistence_adapter = ->(world, _) { initialize_persistence(world) } config.transaction_adapter = transaction_adapter config.executor = ->(world, _) { initialize_executor(world) } config.connector = ->(world, _) { initialize_connector(world) } # we can't do any operation until the Rails.application.dynflow.world is set config.auto_execute = false config.auto_validity_check = false end end
Protected Instance Methods
# File lib/dynflow/rails/configuration.rb, line 160 def default_sequel_adapter_options(world) db_config = ::ActiveRecord::Base.configurations[::Rails.env].dup db_config['adapter'] = db_config['adapter'].gsub(/_?makara_?/, '') db_config['adapter'] = 'postgres' if db_config['adapter'] == 'postgresql' db_config['max_connections'] = calculate_db_pool_size(world) if increase_db_pool_size? if db_config['adapter'] == 'sqlite3' db_config['adapter'] = 'sqlite' database = db_config['database'] unless database == ':memory:' # We need to create separate database for sqlite # to avoid lock conflicts on the database db_config['database'] = "#{File.dirname(database)}/dynflow-#{File.basename(database)}" end end db_config end
# File lib/dynflow/rails/configuration.rb, line 190 def initialize_connector(world) ::Dynflow::Connectors::Database.new(world) end
# File lib/dynflow/rails/configuration.rb, line 178 def initialize_executor(world) if remote? false else if defined?(::Sidekiq) && Sidekiq.options[:dynflow_executor] ::Dynflow::Executors::Sidekiq::Core else ::Dynflow::Executors::Parallel::Core end end end
Sequel adapter based on Rails
app database.yml configuration
# File lib/dynflow/rails/configuration.rb, line 199 def initialize_persistence(world, options = {}) persistence_class.new(default_sequel_adapter_options(world).merge(options)) end
# File lib/dynflow/rails/configuration.rb, line 194 def persistence_class ::Dynflow::PersistenceAdapters::Sequel end