diff options
Diffstat (limited to 'app/workers/concerns/worker_attributes.rb')
-rw-r--r-- | app/workers/concerns/worker_attributes.rb | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb index 6dee9402691..096be808787 100644 --- a/app/workers/concerns/worker_attributes.rb +++ b/app/workers/concerns/worker_attributes.rb @@ -71,6 +71,20 @@ module WorkerAttributes class_attributes[:urgency] || :low end + # Allows configuring worker's data_consistency. + # + # Worker can utilize Sidekiq readonly database replicas capabilities by setting data_consistency attribute. + # Workers with data_consistency set to :delayed or :sticky, calling #perform_async + # will be delayed in order to give replication process enough time to complete. + # + # - *data_consistency* values: + # - 'always' - The job is required to use the primary database (default). + # - 'sticky' - The uses a replica as long as possible. It switches to primary either on write or long replication lag. + # - 'delayed' - The job would switch to primary only on write. It would use replica always. + # If there's a long replication lag the job will be delayed, and only if the replica is not up to date on the next retry, + # it will switch to the primary. + # - *feature_flag* - allows you to toggle a job's `data_consistency, which permits you to safely toggle load balancing capabilities for a specific job. + # If disabled, job will default to `:always`, which means that the job will always use the primary. def data_consistency(data_consistency, feature_flag: nil) raise ArgumentError, "Invalid data consistency: #{data_consistency}" unless VALID_DATA_CONSISTENCIES.include?(data_consistency) raise ArgumentError, 'Data consistency is already set' if class_attributes[:data_consistency] @@ -85,11 +99,16 @@ module WorkerAttributes # Since the deduplication should always take into account the latest binary replication pointer into account, # not the first one, the deduplication will not work with sticky or delayed. # Follow up issue to improve this: https://gitlab.com/gitlab-org/gitlab/-/issues/325291 - if idempotent? && get_data_consistency != :always + if idempotent? && utilizes_load_balancing_capabilities? raise ArgumentError, "Class can't be marked as idempotent if data_consistency is not set to :always" end end + # If data_consistency is not set to :always, worker will try to utilize load balancing capabilities and use the replica + def utilizes_load_balancing_capabilities? + get_data_consistency != :always + end + def get_data_consistency class_attributes[:data_consistency] || :always end @@ -167,6 +186,12 @@ module WorkerAttributes class_attributes[:deduplication_options] || {} end + def deduplication_enabled? + return true unless get_deduplication_options[:feature_flag] + + Feature.enabled?(get_deduplication_options[:feature_flag], default_enabled: :yaml) + end + def big_payload! set_class_attribute(:big_payload, true) end |