Skip to content

Commit 156b9ac

Browse files
authored
Merge pull request rails#51958 from fractaledmind/activerecord-busy-handler-timeout
SQLite non-GVL-blocking, fair retry interval busy handler
2 parents 8bf495a + 2976d37 commit 156b9ac

File tree

7 files changed

+19
-10
lines changed

7 files changed

+19
-10
lines changed

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ platforms :ruby, :windows do
153153
gem "nokogiri", ">= 1.8.1", "!= 1.11.0"
154154

155155
# Active Record.
156-
gem "sqlite3", ">= 1.6.6"
156+
gem "sqlite3", ">= 2.0"
157157

158158
group :db do
159159
gem "pg", "~> 1.3"

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ DEPENDENCIES
690690
sidekiq
691691
sneakers
692692
sprockets-rails (>= 2.0.0)
693-
sqlite3 (>= 1.6.6)
693+
sqlite3 (>= 2.0)
694694
stackprof
695695
stimulus-rails
696696
sucker_punch

activerecord/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
* Replace `SQLite3::Database#busy_timeout` with `#busy_handler_timeout=`
2+
3+
Provides a non-GVL-blocking, fair retry interval busy handler implementation
4+
5+
*Stephen Margheim*
6+
17
* SQLite3Adapter: Translate `SQLite3::BusyException` into `ActiveRecord::StatementTimeout`.
28

39
*Matthew Nguyen*

activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
require "active_record/connection_adapters/sqlite3/schema_dumper"
1212
require "active_record/connection_adapters/sqlite3/schema_statements"
1313

14-
gem "sqlite3", ">= 1.4"
14+
gem "sqlite3", ">= 2.0"
1515
require "sqlite3"
1616

1717
module ActiveRecord
@@ -783,12 +783,15 @@ def configure_connection
783783
if @config[:timeout] && @config[:retries]
784784
raise ArgumentError, "Cannot specify both timeout and retries arguments"
785785
elsif @config[:timeout]
786-
@raw_connection.busy_timeout(self.class.type_cast_config_to_integer(@config[:timeout]))
786+
timeout = self.class.type_cast_config_to_integer(@config[:timeout])
787+
raise TypeError, "timeout must be integer, not #{timeout}" unless timeout.is_a?(Integer)
788+
@raw_connection.busy_handler_timeout = timeout
787789
elsif @config[:retries]
790+
ActiveRecord.deprecator.warn(<<~MSG)
791+
The retries option is deprecated and will be removed in Rails 8.0. Use timeout instead.
792+
MSG
788793
retries = self.class.type_cast_config_to_integer(@config[:retries])
789-
raw_connection.busy_handler do |count|
790-
count <= retries
791-
end
794+
raw_connection.busy_handler { |count| count <= retries }
792795
end
793796

794797
super

railties/lib/rails/generators/database.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def port
223223
end
224224

225225
def gem
226-
["sqlite3", [">= 1.4"]]
226+
["sqlite3", [">= 2.0"]]
227227
end
228228

229229
def base_package

railties/test/generators/app_generator_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ def test_gemfile_has_no_whitespace_errors
449449
def test_config_database_is_added_by_default
450450
run_generator
451451
assert_file "config/database.yml", /sqlite3/
452-
assert_gem "sqlite3", '">= 1.4"'
452+
assert_gem "sqlite3", '">= 2.0"'
453453
end
454454

455455
def test_config_mysql_database

railties/test/generators/db_system_change_generator_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class ChangeGeneratorTest < Rails::Generators::TestCase
128128

129129
assert_file("Gemfile") do |content|
130130
assert_match "# Use sqlite3 as the database for Active Record", content
131-
assert_match 'gem "sqlite3", ">= 1.4"', content
131+
assert_match 'gem "sqlite3", ">= 2.0"', content
132132
end
133133

134134
assert_file("Dockerfile") do |content|

0 commit comments

Comments
 (0)