From 99df085119040c27193ce97c850818b071adb5a0 Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Thu, 15 May 2025 10:09:09 +0100 Subject: [PATCH] Make leader election idempotent --- ruby/lib/ci/queue/redis/worker.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ruby/lib/ci/queue/redis/worker.rb b/ruby/lib/ci/queue/redis/worker.rb index 00013b5d..c5eb5448 100644 --- a/ruby/lib/ci/queue/redis/worker.rb +++ b/ruby/lib/ci/queue/redis/worker.rb @@ -201,7 +201,14 @@ def try_to_reserve_lost_test def push(tests) @total = tests.size - if @master = redis.setnx(key('master-status'), 'setup') + # We set a unique value (worker_id) and read it back to make "SET if Not eXists" idempotent in case of a retry. + value = key('setup', worker_id) + _, status = redis.pipelined do |pipeline| + pipeline.set(key('master-status'), value, nx: true) + pipeline.get(key('master-status')) + end + + if @master = (value == status) puts "Worker electected as leader, pushing #{@total} tests to the queue." puts