Commit 8df7708c authored by Pedro Pombeiro's avatar Pedro Pombeiro Committed by Vladimir Shushlin
Browse files

Add pause control strategy for ClickHouse migrations

Allows pausing Sidekiq jobs when a ClickHouse migration is running
parent 236d5b49
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
module ClickHouse
  class EventsSyncWorker
    include ApplicationWorker
    include ClickHouseWorker
    include Gitlab::ExclusiveLeaseHelpers
    include Gitlab::Utils::StrongMemoize

+30 −0
Original line number Diff line number Diff line
# frozen_string_literal: true

module ClickHouseWorker
  extend ActiveSupport::Concern

  class_methods do
    def register_click_house_worker?
      click_house_worker_attrs.present?
    end

    def click_house_worker_attrs
      get_class_attribute(:click_house_worker_attrs)
    end

    def click_house_migration_lock(ttl)
      raise ArgumentError unless ttl.is_a?(ActiveSupport::Duration)

      set_class_attribute(
        :click_house_worker_attrs,
        (click_house_worker_attrs || {}).merge(migration_lock_ttl: ttl)
      )
    end
  end

  included do
    click_house_migration_lock(ClickHouse::MigrationSupport::ExclusiveLock::DEFAULT_CLICKHOUSE_WORKER_TTL)

    pause_control :click_house_migration
  end
end
+8 −0
Original line number Diff line number Diff line
---
name: pause_clickhouse_workers_during_migration
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/138166
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/433389
milestone: '16.7'
type: development
group: group::runner
default_enabled: false
+8 −0
Original line number Diff line number Diff line
---
name: wait_for_clickhouse_workers_during_migration
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/138166
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/433389
milestone: '16.7'
type: development
group: group::runner
default_enabled: false
+20 −0
Original line number Diff line number Diff line
@@ -205,6 +205,26 @@ end
NOTE:
It's important to test and verify efficient batching of database records from PostgreSQL. Consider using the techniques described in the [Iterating tables in batches](../iterating_tables_in_batches.md).

## Implementing Sidekiq workers

Sidekiq workers leveraging ClickHouse databases should include the `ClickHouseWorker` module.
This ensures that the worker is paused while database migrations are running,
and that migrations do not run while the worker is active.

```ruby
# events_sync_worker.rb
# frozen_string_literal: true

module ClickHouse
  class EventsSyncWorker
    include ApplicationWorker
    include ClickHouseWorker

    ...
  end
end
```

## Testing

ClickHouse is enabled on CI/CD but to avoid significantly affecting the pipeline runtime we've decided to run the ClickHouse server for test cases tagged with `:click_house` only.
Loading