Class: Gitlab::Database::Partitioning::List::LockingConfiguration
- Inherits:
-
Object
- Object
- Gitlab::Database::Partitioning::List::LockingConfiguration
- Defined in:
- lib/gitlab/database/partitioning/list/locking_configuration.rb
Instance Attribute Summary collapse
-
#migration_context ⇒ Object
readonly
Returns the value of attribute migration_context.
Instance Method Summary collapse
-
#initialize(migration_context, table_locking_order:) ⇒ LockingConfiguration
constructor
A new instance of LockingConfiguration.
- #lock_timing_configuration ⇒ Object
-
#locking_order_for(tables) ⇒ Object
Sorts and subsets ‘tables` to the tables that were explicitly requested for locking in the order that that locking was requested.
- #locking_statement_for(tables) ⇒ Object
- #with_lock_retries(&block) ⇒ Object
Constructor Details
#initialize(migration_context, table_locking_order:) ⇒ LockingConfiguration
Returns a new instance of LockingConfiguration.
10 11 12 13 14 |
# File 'lib/gitlab/database/partitioning/list/locking_configuration.rb', line 10 def initialize(migration_context, table_locking_order:) @migration_context = migration_context @table_locking_order = table_locking_order.map(&:to_s) assert_table_names_unqualified!(@table_locking_order) end |
Instance Attribute Details
#migration_context ⇒ Object (readonly)
Returns the value of attribute migration_context.
8 9 10 |
# File 'lib/gitlab/database/partitioning/list/locking_configuration.rb', line 8 def migration_context @migration_context end |
Instance Method Details
#lock_timing_configuration ⇒ Object
37 38 39 40 41 42 |
# File 'lib/gitlab/database/partitioning/list/locking_configuration.rb', line 37 def lock_timing_configuration iterations = Gitlab::Database::WithLockRetries::DEFAULT_TIMING_CONFIGURATION aggressive_iterations = Array.new(5) { [10.seconds, 1.minute] } iterations + aggressive_iterations end |
#locking_order_for(tables) ⇒ Object
Sorts and subsets ‘tables` to the tables that were explicitly requested for locking in the order that that locking was requested.
30 31 32 33 34 35 |
# File 'lib/gitlab/database/partitioning/list/locking_configuration.rb', line 30 def locking_order_for(tables) tables = Array.wrap(tables) assert_table_names_unqualified!(tables) @table_locking_order.intersection(tables.map(&:to_s)) end |
#locking_statement_for(tables) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/gitlab/database/partitioning/list/locking_configuration.rb', line 16 def locking_statement_for(tables) tables_to_lock = locking_order_for(tables) return if tables_to_lock.empty? table_names = tables_to_lock.map { |name| migration_context.quote_table_name(name) }.join(', ') <<~SQL LOCK #{table_names} IN ACCESS EXCLUSIVE MODE SQL end |
#with_lock_retries(&block) ⇒ Object
44 45 46 47 48 49 50 51 |
# File 'lib/gitlab/database/partitioning/list/locking_configuration.rb', line 44 def with_lock_retries(&block) lock_args = { raise_on_exhaustion: true, timing_configuration: lock_timing_configuration } migration_context.with_lock_retries(**lock_args, &block) end |