Skip to content

Commit 2f59f80

Browse files
committed
introduce max_lock_timeout
1 parent 6b0f2c8 commit 2f59f80

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

lib/safe-pg-migrations/configuration.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ class Configuration
1212
backfill_pause
1313
retry_delay
1414
max_tries
15+
max_lock_timeout
1516
sensitive_logger
1617
lock_timeout
17-
safe_timeout
1818
])
19+
attr_reader :safe_timeout
1920

2021
def initialize
2122
self.default_value_backfill_threshold = nil
@@ -27,6 +28,7 @@ def initialize
2728
self.backfill_pause = 0.5.second
2829
self.retry_delay = 1.minute
2930
self.max_tries = 5
31+
self.max_lock_timeout = 1.second
3032
self.sensitive_logger = nil
3133
end
3234

@@ -43,7 +45,7 @@ def lock_timeout=(value)
4345
def safe_timeout=(value)
4446
raise 'Setting safe timeout to 0 disables the safe timeout and is dangerous' unless value
4547

46-
unless lock_timeout.nil? || value > lock_timeout
48+
unless lock_timeout.nil? || value > lock_timeout || value > max_lock_timeout
4749
raise ArgumentError, "Safe timeout (#{value}) cannot be less than lock timeout (#{lock_timeout})"
4850
end
4951

lib/safe-pg-migrations/plugins/statement_retrier.rb

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,18 @@ module StatementRetrier
1313
private
1414

1515
def retry_if_lock_timeout
16-
remaining_tries = SafePgMigrations.config.max_tries
16+
number_of_retries = 0
1717
begin
18-
remaining_tries -= 1
18+
number_of_retries += 1
1919
yield
2020
rescue ActiveRecord::LockWaitTimeout
2121
raise if transaction_open? # Retrying is useless if we're inside a transaction.
22-
raise unless remaining_tries > 0
22+
raise if number_of_retries >= SafePgMigrations.config.max_tries
2323

24-
number_of_retries = SafePgMigrations.config.max_tries - remaining_tries
25-
if SafePgMigrations.config.max_tries - remaining_tries <= 20
24+
if SafePgMigrations.config.lock_timeout < SafePgMigrations.config.max_lock_timeout
2625
SafePgMigrations.config.lock_timeout = SafePgMigrations.config.lock_timeout * number_of_retries
27-
SafePgMigrations.config.safe_timeout = SafePgMigrations.config.safe_timeout * number_of_retries
2826
else
29-
SafePgMigrations.config.lock_timeout = SafePgMigrations.config.lock_timeout * 20
30-
SafePgMigrations.config.safe_timeout = SafePgMigrations.config.safe_timeout * 20
27+
SafePgMigrations.config.lock_timeout = SafePgMigrations.config.max_lock_timeout
3128
end
3229

3330
retry_delay = SafePgMigrations.config.retry_delay

0 commit comments

Comments
 (0)