Skip to content

Commit e61df4e

Browse files
Active Record Trilogy Adapter needs to intercept #raw_execute (#494)
* Update lockfiles for Trilogy; use the Trilogy adapter in rails * Active Record Trilogy Adapter needs to intercept `#raw_execute` Changes made to Rails (rails/rails@f69bbcb) mean that most database methods no longer use the public `#execute` method and go through `#raw_execute` instead. * Fix Trilogy tests that now trigger circuit breaker These tests call `connect!` in a background thread, which previously would not acquire a resource other than the connection-scoped one. This means that once the latency had passed, the background thread would finish calling `#connect!` successfully, and subsequent attempts to connect would trigger the circuit breaker. However, with the changes to Rails, `#connect!` now calls `#raw_execute`, which is circuit broken. Thus, when the background thread's latency has passed, we'll see a `TrilogyAdapter::CircuitOpenError`.
1 parent 31e78f3 commit e61df4e

11 files changed

+40
-75
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Unreleased
22

3-
Nil
3+
* Active Record Trilogy adapter needs to patch `#raw_execute` instead of `#execute` for queries. (#494)
44

55
# v0.19.0
66

Gemfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ group :test do
1717
# The last stable version for MacOS ARM darwin
1818
gem "grpc", "1.47.0"
1919
gem "mysql2", "~> 0.5"
20-
gem "trilogy", github: "github/trilogy", branch: "main", glob: "contrib/ruby/*.gemspec"
20+
gem "trilogy", "~> 2.4"
2121
gem "activerecord", github: "rails/rails", branch: "main"
22-
gem "activerecord-trilogy-adapter", github: "github/activerecord-trilogy-adapter", branch: "main"
2322
gem "hiredis", "~> 0.6"
2423
# NOTE: v0.12.0 required for ruby 3.2.0. https://github.com/redis-rb/redis-client/issues/58
2524
gem "hiredis-client", ">= 0.12.0"

Gemfile.lock

Lines changed: 11 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/activerecord_trilogy_adapter/00_circuit_minimal.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# frozen_string_literal: true
22

3-
require "activerecord-trilogy-adapter"
43
require "semian"
54
require "semian/activerecord_trilogy_adapter"
65
require_relative "../colors"

examples/activerecord_trilogy_adapter/03_circuit_open.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# frozen_string_literal: true
22

3-
require "activerecord-trilogy-adapter"
43
require "semian"
54
require "semian/activerecord_trilogy_adapter"
65
require_relative "../colors"

gemfiles/activerecord_trilogy_adapter.gemfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ gem "mocha"
99
gem "toxiproxy"
1010
gem "webrick"
1111

12-
gem "trilogy", github: "github/trilogy", branch: "main", glob: "contrib/ruby/*.gemspec"
13-
gem "activerecord-trilogy-adapter", github: "github/activerecord-trilogy-adapter", branch: "main"
12+
gem "trilogy", "~> 2.4"
1413
gem "activerecord", github: "rails/rails"
1514

1615
gemspec path: "../"

gemfiles/activerecord_trilogy_adapter.gemfile.lock

Lines changed: 9 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gemfiles/rails_trilogy.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ gem "mocha"
99
gem "toxiproxy"
1010
gem "webrick"
1111

12-
gem "trilogy", github: "github/trilogy", branch: "main", glob: "contrib/ruby/*.gemspec"
12+
gem "trilogy", "~> 2.4"
1313
# we can share the Gemfile with rails mysql2 once activerecord is released with the trilogy adapter
1414
gem "activerecord", github: "rails/rails", branch: "main"
1515

gemfiles/rails_trilogy.gemfile.lock

Lines changed: 5 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/semian/activerecord_trilogy_adapter.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,16 @@ def initialize(*options)
4747
super
4848
end
4949

50-
def execute(sql, *)
50+
def raw_execute(sql, *)
5151
if query_allowlisted?(sql)
5252
super
5353
else
54-
acquire_semian_resource(adapter: :trilogy_adapter, scope: :execute) do
54+
acquire_semian_resource(adapter: :trilogy_adapter, scope: :query) do
5555
super
5656
end
5757
end
5858
end
59-
ruby2_keywords :execute
59+
ruby2_keywords :raw_execute
6060

6161
def active?
6262
acquire_semian_resource(adapter: :trilogy_adapter, scope: :ping) do

test/adapters/activerecord_trilogy_adapter_test.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def test_query_instrumentation
155155

156156
assert_equal(:success, event)
157157
assert_equal(Semian[:mysql_testing], resource)
158-
assert_equal(:execute, scope)
158+
assert_equal(:query, scope)
159159
assert_equal(:trilogy_adapter, adapter)
160160
end
161161

@@ -228,7 +228,9 @@ def test_resource_acquisition_for_query
228228

229229
def test_resource_timeout_on_connect
230230
@proxy.downstream(:latency, latency: 500).apply do
231-
background { @adapter.connect! }
231+
background do
232+
assert_raises(TrilogyAdapter::CircuitOpenError) { @adapter.connect! }
233+
end
232234

233235
assert_raises(TrilogyAdapter::ResourceBusyError) do
234236
trilogy_adapter.send(:connect) # Avoid going through connect!, which will call #active?
@@ -238,7 +240,9 @@ def test_resource_timeout_on_connect
238240

239241
def test_circuit_breaker_on_connect
240242
@proxy.downstream(:latency, latency: 500).apply do
241-
background { @adapter.connect! }
243+
background do
244+
assert_raises(TrilogyAdapter::CircuitOpenError) { @adapter.connect! }
245+
end
242246

243247
ERROR_THRESHOLD.times do
244248
assert_raises(TrilogyAdapter::ResourceBusyError) do
@@ -249,10 +253,6 @@ def test_circuit_breaker_on_connect
249253

250254
yield_to_background
251255

252-
assert_raises(TrilogyAdapter::CircuitOpenError) do
253-
trilogy_adapter.connect!
254-
end
255-
256256
time_travel(ERROR_TIMEOUT + 1) do
257257
trilogy_adapter.connect!
258258
end
@@ -385,7 +385,7 @@ def test_changes_timeout_when_half_open_and_configured
385385
end
386386

387387
def test_trilogy_default_read_timeout
388-
client = Trilogy.new(@configuration.slice(:username, :host, :port))
388+
client = ::Trilogy.new(@configuration.slice(:username, :host, :port))
389389

390390
assert_equal(0, client.read_timeout)
391391
end

0 commit comments

Comments
 (0)