Skip to content
  • eileencodes's avatar
    d9639a21
    Allow async executor to be configurable · d9639a21
    eileencodes authored
    
    
    This is a followup/alternative to #41406. This change wouldn't work for
    GitHub because we intend to implement an executor for each database and
    use the database configuration to set the `min_threads` and
    `max_threads` for each one.
    
    The changes here borrow from #41406 by implementing an
    `Concurrent::ImmediateExecutor` by default. Otherwise applications have
    the option of having one global thread pool that is used by all connections
    or a thread pool for each connection. A global thread pool can set with
    `config.active_record.async_query_executor = :global_thread_pool`. This
    will create a single `Concurrent::ThreadPoolExecutor` for applications
    to utilize. By default the concurrency is 4, but it can be changed for the
    `global_thread_pool` by setting `global_executor_concurrency` to another
    number. If applications want to use a thread pool per database
    connection they can set `config.active_record.async_query_executor =
    :multi_thread_pool`. This will create a `Concurrent::ThreadPoolExecutor`
    for each database connection and set the `min_threads` and `max_threads`
    by their configuration values or the defaults.
    
    I've also moved the async tests out of the adapter test and into their
    own tests and added tests for all the new functionality. This change
    would allow us at GitHub to control threads per database and per
    writer/reader or other apps to use one global executor. The immediate
    executor allows apps to no-op by default.
    
    Took the immediate executor idea from Jean's PR.
    Co-authored-by: default avatarJean Boussier <jean.boussier@gmail.com>
    d9639a21
    Allow async executor to be configurable
    eileencodes authored
    
    
    This is a followup/alternative to #41406. This change wouldn't work for
    GitHub because we intend to implement an executor for each database and
    use the database configuration to set the `min_threads` and
    `max_threads` for each one.
    
    The changes here borrow from #41406 by implementing an
    `Concurrent::ImmediateExecutor` by default. Otherwise applications have
    the option of having one global thread pool that is used by all connections
    or a thread pool for each connection. A global thread pool can set with
    `config.active_record.async_query_executor = :global_thread_pool`. This
    will create a single `Concurrent::ThreadPoolExecutor` for applications
    to utilize. By default the concurrency is 4, but it can be changed for the
    `global_thread_pool` by setting `global_executor_concurrency` to another
    number. If applications want to use a thread pool per database
    connection they can set `config.active_record.async_query_executor =
    :multi_thread_pool`. This will create a `Concurrent::ThreadPoolExecutor`
    for each database connection and set the `min_threads` and `max_threads`
    by their configuration values or the defaults.
    
    I've also moved the async tests out of the adapter test and into their
    own tests and added tests for all the new functionality. This change
    would allow us at GitHub to control threads per database and per
    writer/reader or other apps to use one global executor. The immediate
    executor allows apps to no-op by default.
    
    Took the immediate executor idea from Jean's PR.
    Co-authored-by: default avatarJean Boussier <jean.boussier@gmail.com>
Loading