From 3f6c2f82d00d12d376d552aaa52abb184178b1d8 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 3 Feb 2022 10:00:28 +0000 Subject: [PATCH] DEV: Use MiniSql ActiveRecordPostgres adapter (#15767) This adapter ensures that MiniSql locks the ActiveRecord mutex before using the raw PG connection. This ensures that multiple threads will not attempt to use the same connection simultaneously. This commit also removes the schema_cache_concurrency freedom-patch, which is no longer required now that cross-thread connection use is controlled by the mutex. For the original root cause of this issue, see https://github.com/rails/rails/pull/38577 --- Gemfile.lock | 2 +- .../schema_cache_concurrency.rb | 27 ------------------- lib/mini_sql_multisite_connection.rb | 6 ++--- 3 files changed, 4 insertions(+), 31 deletions(-) delete mode 100644 lib/freedom_patches/schema_cache_concurrency.rb diff --git a/Gemfile.lock b/Gemfile.lock index 068c2ce7004..a4c43815041 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -236,7 +236,7 @@ GEM libv8-node (~> 16.10.0.0) mini_scheduler (0.13.0) sidekiq (>= 4.2.3) - mini_sql (1.1.3) + mini_sql (1.3.0) mini_suffix (0.3.3) ffi (~> 1.9) minitest (5.15.0) diff --git a/lib/freedom_patches/schema_cache_concurrency.rb b/lib/freedom_patches/schema_cache_concurrency.rb deleted file mode 100644 index b805c665269..00000000000 --- a/lib/freedom_patches/schema_cache_concurrency.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true -# -# Rails has a circular dependency in SchemaCache. -# In certain situation SchemaCache can carry a @connection -# from a different thread. This causes potential concurrency bugs -# in Sidekiq. -# -# This patches it so it is less flexible (theoretically) but always bound to the current connection - -# This patch needs to be reviewed in future versions of Rails. -# We should consider upstreaming this optionally. - -module ActiveRecord - module ConnectionAdapters - class SchemaCache - - def connection=(connection) - # AbstractPool get_schema_cache does schema_cache.connection = connection - Thread.current["schema_cached_connection"] = connection - end - - def connection - Thread.current["schema_cached_connection"] - end - end - end -end diff --git a/lib/mini_sql_multisite_connection.rb b/lib/mini_sql_multisite_connection.rb index a4feb1a8706..26ad1d50263 100644 --- a/lib/mini_sql_multisite_connection.rb +++ b/lib/mini_sql_multisite_connection.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class MiniSqlMultisiteConnection < MiniSql::Postgres::Connection +class MiniSqlMultisiteConnection < MiniSql::ActiveRecordPostgres::Connection class CustomBuilder < MiniSql::Builder @@ -78,8 +78,8 @@ class MiniSqlMultisiteConnection < MiniSql::Postgres::Connection # we need a tiny adapter here so we always run against the # correct multisite connection - def raw_connection - ActiveRecord::Base.connection.raw_connection + def active_record_connection + ActiveRecord::Base.connection end # make for a multisite friendly prepared statement cache