mirror of
https://github.com/internetee/registry.git
synced 2025-06-10 06:34:46 +02:00
Merge pull request #2137 from internetee/2135-fix-possible-transaction-retries
Fix possible transaction retries on domain renew
This commit is contained in:
commit
28e7e6d3f6
6 changed files with 38 additions and 18 deletions
|
@ -8,9 +8,12 @@ module Domains
|
|||
object :registrar
|
||||
|
||||
def execute
|
||||
renewed_expire_time = prepare_renewed_expire_time
|
||||
in_transaction_with_retries do
|
||||
check_balance
|
||||
success = domain.renew(domain.valid_to, period, unit)
|
||||
success = domain.renew(renewed_expire_time: renewed_expire_time,
|
||||
period: period,
|
||||
unit: unit)
|
||||
if success
|
||||
check_balance
|
||||
reduce_balance
|
||||
|
@ -42,7 +45,8 @@ module Domains
|
|||
else
|
||||
transaction_wrapper { yield }
|
||||
end
|
||||
rescue ActiveRecord::StatementInvalid
|
||||
rescue ActiveRecord::StatementInvalid => e
|
||||
log_error e
|
||||
sleep rand / 100
|
||||
retry
|
||||
end
|
||||
|
@ -59,6 +63,26 @@ module Domains
|
|||
domain.add_epp_error(2104, nil, nil, I18n.t(:domain_renew_error_for_domain))
|
||||
errors.add(:domain, I18n.t('domain_renew_error_for_domain', domain: domain.name))
|
||||
end
|
||||
|
||||
def prepare_renewed_expire_time
|
||||
int_period = period.to_i
|
||||
plural_period_unit_name = (unit == 'm' ? 'months' : 'years').to_sym
|
||||
renewed_expire_time = domain.valid_to.advance(plural_period_unit_name => int_period.to_i)
|
||||
|
||||
max_reg_time = 11.years.from_now
|
||||
|
||||
if renewed_expire_time >= max_reg_time
|
||||
domain.add_epp_error('2105', nil, nil, I18n.t('epp.domains.object_is_not_eligible_for_renewal',
|
||||
max_date: max_reg_time.to_date.to_s(:db)))
|
||||
end
|
||||
renewed_expire_time
|
||||
end
|
||||
|
||||
def log_error(error)
|
||||
message = (["#{self.class} - #{error.class}: #{error.message}"] + error.backtrace)
|
||||
.join("\n")
|
||||
Rails.logger.error message
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -173,26 +173,13 @@ class Epp::Domain < Domain
|
|||
|
||||
### RENEW ###
|
||||
|
||||
def renew(cur_exp_date, period, unit = 'y')
|
||||
def renew(renewed_expire_time:, period:, unit:)
|
||||
@is_renewal = true
|
||||
validate_exp_dates(cur_exp_date)
|
||||
|
||||
add_renew_epp_errors unless renewable?
|
||||
|
||||
return false if errors.any?
|
||||
|
||||
period = period.to_i
|
||||
plural_period_unit_name = (unit == 'm' ? 'months' : 'years').to_sym
|
||||
renewed_expire_time = valid_to.advance(plural_period_unit_name => period.to_i)
|
||||
|
||||
max_reg_time = 11.years.from_now
|
||||
|
||||
if renewed_expire_time >= max_reg_time
|
||||
add_epp_error('2105', nil, nil, I18n.t('epp.domains.object_is_not_eligible_for_renewal',
|
||||
max_date: max_reg_time.to_date.to_s(:db)))
|
||||
return false if errors.any?
|
||||
end
|
||||
|
||||
self.expire_time = renewed_expire_time
|
||||
self.outzone_at = nil
|
||||
self.delete_date = nil
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue