Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RuntimeError: can't add a new key into hash during iteration on lib/active_record/connection_adapters/abstract/query_cache.rb #45287

Closed
sobrinho opened this issue Jun 7, 2022 · 15 comments

Comments

@sobrinho
Copy link
Contributor

sobrinho commented Jun 7, 2022

Steps to reproduce

No idea how to reproduce.

Expected behavior

No concurrency errors in query cache.

Actual behavior

A concurrency error in query cache.

It is happening inside a Sidekiq worker, FWIW.

And it has been happening for at least a year now:

Screen Shot 2022-06-07 at 12 46 42

Here's the backtrace:

      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:118:in `block in cache_sql'",
      "/app/vendor/cache/ruby/2.7.0/gems/activesupport-6.1.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:26:in `block (2 levels) in synchronize'",
      "/app/vendor/cache/ruby/2.7.0/gems/activesupport-6.1.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'",
      "/app/vendor/cache/ruby/2.7.0/gems/activesupport-6.1.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'",
      "/app/vendor/cache/ruby/2.7.0/gems/activesupport-6.1.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'",
      "/app/vendor/cache/ruby/2.7.0/gems/activesupport-6.1.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:109:in `cache_sql'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:101:in `select_all'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/querying.rb:47:in `find_by_sql'",
      "/app/vendor/cache/ruby/2.7.0/gems/scout_apm-2.6.6/lib/scout_apm/instruments/active_record.rb:333:in `find_by_sql_with_scout_instruments'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/statement_cache.rb:150:in `execute'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/associations/association.rb:227:in `find_target'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/associations/singular_association.rb:39:in `find_target'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/associations/association.rb:174:in `load_target'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/associations/association.rb:67:in `reload'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/associations/singular_association.rb:9:in `reader'",
      "/app/vendor/cache/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/associations/builder/association.rb:103:in `location'",
      "/app/app/services/my_service.rb:9:in `initialize'",

Pseudo code from the original source code:

class MyWorker
  include Sidekiq::Worker

  def perform
    MyModel.where('x < ?', 1.month.ago).where(a_column: A_VALUE).find_each do |my_model|
      MyService.new(lead_source).something
    end
  end
end

class MyService
  def initialize(my_model)
    @my_model = my_model
    @something = my_model.a_standard_belongs_to_relation # error is triggered here!
  end

  def something
    # ...
  end
end

This has been reported before here but without a specific solution.

sentry-raven, sentry-ruby and activerecord-import were mentioned but we aren't using it but we do have prometheus_exporter.

What I don't get is how this error could happen considering there is a monitor around the query cache.

System configuration

Rails version: 6.1.3.2

Ruby version: 2.7.2

@luanzeba
Copy link
Member

luanzeba commented Jun 7, 2022

Hi @sobrinho , thanks for opening this issue!
There have been a lot of changes since Rails 6.1. Are you able to verify this issue happens on Rails 7 as well?

@sobrinho
Copy link
Contributor Author

sobrinho commented Jun 7, 2022

Checking the source code there is almost no changes between 6.1.3.2 and master in that regard.

Upgrading from 6.1 to 7.0 is also not easy due to the size/nature of the application, it will take a while.

@luanzeba luanzeba self-assigned this Jun 7, 2022
@luanzeba
Copy link
Member

luanzeba commented Jun 7, 2022

Fair enough. I'm planning to take a look at this in the next few weeks and will report back if I find anything interesting.

That being said, the Rails maintenance policy is to only apply bug fixes to the latest release series https://guides.rubyonrails.org/maintenance_policy.html#bug-fixes, so if anyone reading this bug is able to reproduce this in Rails 7, that would be helpful!

@eileencodes
Copy link
Member

The reason that the other issue didn't have a solution is because we're pretty sure that this isn't a bug in Rails and no one has provided a way to reproduce or prove that it is Rails.

The code already has lock synchronization so it is likely an external gem that is incorrectly iterating over the query cache. Since we can't see your application, we can't guess what that gem might be. I'd start with scout-apm as it's in your stack trace and is on a version that is 3 years old.

@sobrinho
Copy link
Contributor Author

sobrinho commented Jun 7, 2022

@eileencodes I can provide further details in the case of need.

So far I can tell that there is no references to query_cache in any of the gems used or our my app:

$ ag query_cache

$ ag query_cache $(bundle show --paths | grep -v /Users/sobrinho/.gem/ruby/2.7.2/gems/activerecord-6.1.3.2)
[DEPRECATED] use `bundle list` instead of `bundle show --paths`
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
/Users/sobrinho/.gem/ruby/2.7.2/gems/actionview-6.1.3.2/lib/action_view/template/resolver.rb
92:        @query_cache = SmallCache.new
96:        "#{to_s[0..-2]} keys=#{@data.size} queries=#{@query_cache.size}>"
105:        @query_cache[query] ||= canonical_no_templates(yield)
110:        @query_cache.clear
127:        size + @query_cache.size

That includes scout_apm, of course, no mentions to query_cache at all.

@eileencodes
Copy link
Member

It might not be a direct reference to the query cache, but a lack of a lock synch in code overriding Active Record.

@sobrinho
Copy link
Contributor Author

sobrinho commented Jun 7, 2022

@eileencodes alright, let me try to update the gem and see what happens

@jordan-brough
Copy link
Contributor

jordan-brough commented Jul 1, 2022

This just started happening to us also, and I get the same search result as @sobrinho:

$ ag '\bquery_cache\b' $(bundle list --paths)
Click to show results
/Users/jordan/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/actionview-6.1.6/lib/action_view/template/resolver.rb
92:        @query_cache = SmallCache.new
96:        "#{to_s[0..-2]} keys=#{@data.size} queries=#{@query_cache.size}>"
105:        @query_cache[query] ||= canonical_no_templates(yield)
110:        @query_cache.clear
127:        size + @query_cache.size

/Users/jordan/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-6.1.6/lib/active_record/connection_adapters/abstract/query_cache.rb
50:      attr_reader :query_cache, :query_cache_enabled
54:        @query_cache         = Hash.new { |h, sql| h[sql] = {} }
92:          @query_cache.clear
111:              if @query_cache[sql].key?(binds)
116:                @query_cache[sql][binds]
118:                @query_cache[sql][binds] = yield

It might not be a direct reference to the query cache, but a lack of a lock synch in code overriding Active Record.

If the only manipulation of / access of @query_cache happens in QueryCache, then I think these are the only operations performed on @query_cache:

@query_cache = Hash.new { |h, sql| h[sql] = {} }
@query_cache.clear
@query_cache[sql]

Right?

Does anyone know how to trigger a RuntimeError: can't add a new key into hash during iteration using just those primitives? (assuming that the locking has been messed up)

@sobrinho
Copy link
Contributor Author

sobrinho commented Jul 4, 2022

@jordan-brough please keep me updated if you find anything new, we are going to release the gem upgrade as suggested by Eileen but since there is no manipulation in the query cache at all, I'm guessing it won't take any effect.

I will keep here updated as well.

@luanzeba luanzeba removed their assignment Jul 12, 2022
@rails-bot
Copy link

rails-bot bot commented Oct 10, 2022

This issue has been automatically marked as stale because it has not been commented on for at least three months.
The resources of the Rails team are limited, and so we are asking for your help.
If you can still reproduce this error on the 7-0-stable branch or on main, please reply with all of the information you have about it in order to keep the issue open.
Thank you for all your contributions.

@rails-bot rails-bot bot added the stale label Oct 10, 2022
@sobrinho
Copy link
Contributor Author

I'm still seeing this in a few different places, even during HTTP requests.

* 		[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/query_cache.rb:118 :in `block in cache_sql`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:26 :in `block (2 levels) in synchronize`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25 :in `handle_interrupt`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25 :in `block in synchronize`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21 :in `handle_interrupt`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21 :in `synchronize`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/query_cache.rb:109 :in `cache_sql`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/query_cache.rb:101 :in `select_all`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/querying.rb:47 :in `find_by_sql`
* 		
[GEM_ROOT]/gems/scout_apm-4.1.1/lib/scout_apm/instruments/active_record.rb:321 :in `find_by_sql_with_scout_instruments`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/statement_cache.rb:150 :in `execute`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/associations/association.rb:227 :in `find_target`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/associations/collection_association.rb:274 :in `load_target`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/associations/collection_proxy.rb:43 :in `load_target`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/associations/collection_proxy.rb:1002 :in `records`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/relation/delegation.rb:88 :in `each`
* 		
[PROJECT_ROOT]/app/controllers/locations_controller.rb:12 :in `block in index`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/relation/delegation.rb:88 :in `each`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/relation/delegation.rb:88 :in `each`
* 		
[PROJECT_ROOT]/app/controllers/locations_controller.rb:11 :in `index`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal/basic_implicit_render.rb:6 :in `send_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/abstract_controller/base.rb:228 :in `process_action`
* 		
[GEM_ROOT]/gems/scout_apm-4.1.1/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb:103 :in `process_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal/rendering.rb:30 :in `process_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/abstract_controller/callbacks.rb:42 :in `block in process_action`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/callbacks.rb:117 :in `block in run_callbacks`
* 		
[GEM_ROOT]/gems/actiontext-6.1.3.1/lib/action_text/rendering.rb:20 :in `with_renderer`
* 		
[GEM_ROOT]/gems/actiontext-6.1.3.1/lib/action_text/engine.rb:55 :in `block (4 levels) in <class:Engine>`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/callbacks.rb:126 :in `instance_exec`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/callbacks.rb:126 :in `block in run_callbacks`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/callbacks.rb:137 :in `run_callbacks`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/abstract_controller/callbacks.rb:41 :in `process_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal/rescue.rb:22 :in `process_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal/instrumentation.rb:34 :in `block in process_action`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/notifications.rb:203 :in `block in instrument`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/notifications/instrumenter.rb:24 :in `instrument`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/notifications.rb:203 :in `instrument`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal/instrumentation.rb:33 :in `process_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal/params_wrapper.rb:249 :in `process_action`
* 		
[GEM_ROOT]/gems/activerecord-6.1.3.1/lib/active_record/railties/controller_runtime.rb:27 :in `process_action`
* 		
[GEM_ROOT]/gems/scout_apm-4.1.1/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb:120 :in `process_action`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/abstract_controller/base.rb:165 :in `process`
* 		
[GEM_ROOT]/gems/actionview-6.1.3.1/lib/action_view/rendering.rb:39 :in `process`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal.rb:190 :in `dispatch`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_controller/metal.rb:254 :in `dispatch`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/routing/route_set.rb:50 :in `dispatch`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/routing/route_set.rb:33 :in `serve`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/journey/router.rb:50 :in `block in serve`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/journey/router.rb:32 :in `each`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/journey/router.rb:32 :in `serve`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/routing/route_set.rb:842 :in `call`
* 		
[GEM_ROOT]/gems/scout_apm-4.1.1/lib/scout_apm/instruments/rails_router.rb:29 :in `call_with_scout_instruments`
* 		
[GEM_ROOT]/gems/omniauth-1.9.1/lib/omniauth/strategy.rb:192 :in `call!`
* 		
[GEM_ROOT]/gems/omniauth-1.9.1/lib/omniauth/strategy.rb:169 :in `call`
* 		
[GEM_ROOT]/gems/scout_apm-4.1.1/lib/scout_apm/middleware.rb:17 :in `call`
* 		
[GEM_ROOT]/gems/warden-1.2.9/lib/warden/manager.rb:36 :in `block in call`
* 		
[GEM_ROOT]/gems/warden-1.2.9/lib/warden/manager.rb:34 :in `catch`
* 		
[GEM_ROOT]/gems/warden-1.2.9/lib/warden/manager.rb:34 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/tempfile_reaper.rb:15 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/etag.rb:27 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/conditional_get.rb:27 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/head.rb:12 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/http/permissions_policy.rb:22 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/http/content_security_policy.rb:18 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/session/abstract/id.rb:266 :in `context`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/session/abstract/id.rb:260 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/cookies.rb:689 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/callbacks.rb:27 :in `block in call`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/callbacks.rb:98 :in `run_callbacks`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/callbacks.rb:26 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/actionable_exceptions.rb:18 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/debug_exceptions.rb:29 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/show_exceptions.rb:33 :in `call`
* 		
[GEM_ROOT]/gems/lograge-0.11.2/lib/lograge/rails_ext/rack/logger.rb:15 :in `call_app`
* 		
[GEM_ROOT]/gems/railties-6.1.3.1/lib/rails/rack/logger.rb:26 :in `block in call`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/tagged_logging.rb:99 :in `block in tagged`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/tagged_logging.rb:37 :in `tagged`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/tagged_logging.rb:99 :in `tagged`
* 		
[GEM_ROOT]/gems/railties-6.1.3.1/lib/rails/rack/logger.rb:26 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/remote_ip.rb:81 :in `call`
* 		
[GEM_ROOT]/gems/request_store-1.5.0/lib/request_store/middleware.rb:19 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/request_id.rb:26 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/method_override.rb:24 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/runtime.rb:22 :in `call`
* 		
[GEM_ROOT]/gems/activesupport-6.1.3.1/lib/active_support/cache/strategy/local_cache_middleware.rb:29 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/executor.rb:14 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/static.rb:24 :in `call`
* 		
[GEM_ROOT]/gems/rack-2.2.3/lib/rack/sendfile.rb:110 :in `call`
* 		
[GEM_ROOT]/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/host_authorization.rb:92 :in `call`
* 		
[GEM_ROOT]/gems/rack-cors-1.1.1/lib/rack/cors.rb:100 :in `call`
* 		
[GEM_ROOT]/gems/scout_apm-4.1.1/lib/scout_apm/instruments/middleware_summary.rb:58 :in `call`
* 		
[GEM_ROOT]/gems/railties-6.1.3.1/lib/rails/engine.rb:539 :in `call`
* 		
[GEM_ROOT]/gems/puma-3.12.6/lib/puma/configuration.rb:227 :in `call`
* 		
[GEM_ROOT]/gems/puma-3.12.6/lib/puma/server.rb:706 :in `handle_request`
* 		
[GEM_ROOT]/gems/puma-3.12.6/lib/puma/server.rb:476 :in `process_client`
* 		
[GEM_ROOT]/gems/puma-3.12.6/lib/puma/server.rb:334 :in `block in run`
* 		
[GEM_ROOT]/gems/puma-3.12.6/lib/puma/thread_pool.rb:135 :in `block in spawn_thread`

@rails-bot rails-bot bot removed the stale label Oct 10, 2022
@rails-bot
Copy link

rails-bot bot commented Jan 8, 2023

This issue has been automatically marked as stale because it has not been commented on for at least three months.
The resources of the Rails team are limited, and so we are asking for your help.
If you can still reproduce this error on the 7-0-stable branch or on main, please reply with all of the information you have about it in order to keep the issue open.
Thank you for all your contributions.

@rails-bot rails-bot bot added the stale label Jan 8, 2023
@rails-bot rails-bot bot closed this as completed Jan 15, 2023
@kamil-kudra
Copy link

Fair enough. I'm planning to take a look at this in the next few weeks and will report back if I find anything interesting.

That being said, the Rails maintenance policy is to only apply bug fixes to the latest release series https://guides.rubyonrails.org/maintenance_policy.html#bug-fixes, so if anyone reading this bug is able to reproduce this in Rails 7, that would be helpful!

Reproduced almost the same issue at 7.0.8.1 - also mostly in Sidekiq workers.

@sobrinho
Copy link
Contributor Author

Not stale then.

@kamil-kudra
Copy link

kamil-kudra commented Apr 18, 2024

All I found looks related to concurrent-ruby and working on shared hash between threads. Could it be related?
ruby-concurrency/concurrent-ruby#1040
ruby-concurrency/concurrent-ruby#970

concurrent-ruby: 1.2.3
rails: 7.0.8.1
ruby: 3.2.2
sidekiq: 7.1.4 and 7.2.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants