Commit 7bba90cd authored by Toon Claes's avatar Toon Claes

Extract EachShardWorker into a concern

parent 648056b8
module EachShardWorker
extend ActiveSupport::Concern
include ::Gitlab::Utils::StrongMemoize
HEALTHY_SHARD_CHECKS = [
Gitlab::HealthChecks::GitalyCheck
].freeze
def each_shard
eligible_shard_names.each do |shard_name|
yield shard_name
end
end
# override when you want to filter out some shards
def eligible_shard_names
healthy_shard_names
end
def healthy_shard_names
strong_memoize(:healthy_shard_names) do
# For now, we need to perform both Gitaly and direct filesystem checks to ensure
# the shard is healthy. We take the intersection of the successful checks
# as the healthy shards.
healthy_ready_shards.map { |result| result.labels[:shard] }.compact.uniq
end
end
def healthy_ready_shards
ready_shards.map { |result| result.select(&:success) }.inject(:&)
end
def ready_shards
HEALTHY_SHARD_CHECKS.map(&:readiness)
end
end
...@@ -3,43 +3,18 @@ module Geo ...@@ -3,43 +3,18 @@ module Geo
class PerShardSchedulerWorker class PerShardSchedulerWorker
include ApplicationWorker include ApplicationWorker
include CronjobQueue include CronjobQueue
include ::Gitlab::Utils::StrongMemoize
include ::Gitlab::Geo::LogHelpers include ::Gitlab::Geo::LogHelpers
include ::EachShardWorker
HEALTHY_SHARD_CHECKS = [
Gitlab::HealthChecks::GitalyCheck
].freeze
def perform def perform
Gitlab::Geo::ShardHealthCache.update(eligible_shard_names) Gitlab::Geo::ShardHealthCache.update(eligible_shard_names)
eligible_shard_names.each { |shard_name| schedule_job(shard_name) } each_shard { |shard_name| schedule_job(shard_name) }
end
def eligible_shard_names
healthy_shard_names
end end
def schedule_job(shard_name) def schedule_job(shard_name)
raise NotImplementedError raise NotImplementedError
end end
def healthy_shard_names
strong_memoize(:healthy_shard_names) do
# For now, we need to perform both Gitaly and direct filesystem checks to ensure
# the shard is healthy. We take the intersection of the successful checks
# as the healthy shards.
healthy_ready_shards.map { |result| result.labels[:shard] }.compact.uniq
end
end
def ready_shards
HEALTHY_SHARD_CHECKS.map(&:readiness)
end
def healthy_ready_shards
ready_shards.map { |result| result.select(&:success) }.inject(:&)
end
end end
end end
end end
...@@ -17,12 +17,6 @@ describe Geo::Scheduler::PerShardSchedulerWorker do ...@@ -17,12 +17,6 @@ describe Geo::Scheduler::PerShardSchedulerWorker do
expect(described_class).to include_module(::Gitlab::Geo::LogHelpers) expect(described_class).to include_module(::Gitlab::Geo::LogHelpers)
end end
it 'includes Gitaly health checks' do
expect(described_class::HEALTHY_SHARD_CHECKS).to include(
Gitlab::HealthChecks::GitalyCheck
)
end
describe 'instance methods' do describe 'instance methods' do
subject(:per_shard_scheduler_worker) { described_class.new } subject(:per_shard_scheduler_worker) { described_class.new }
...@@ -47,7 +41,7 @@ describe Geo::Scheduler::PerShardSchedulerWorker do ...@@ -47,7 +41,7 @@ describe Geo::Scheduler::PerShardSchedulerWorker do
end end
describe '#ready_shards' do describe '#ready_shards' do
let(:ready_shards) { [[default_shard, other_shard, unhealthy_shard]] } let(:ready_shards) { [default_shard, other_shard, unhealthy_shard] }
it "returns an array of ready shards" do it "returns an array of ready shards" do
expect(per_shard_scheduler_worker.ready_shards).to eq(ready_shards) expect(per_shard_scheduler_worker.ready_shards).to eq(ready_shards)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment