diff --git a/redis/reserve_lost.lua b/redis/reserve_lost.lua index 1f178e9..d712111 100644 --- a/redis/reserve_lost.lua +++ b/redis/reserve_lost.lua @@ -18,6 +18,14 @@ end for _, test in ipairs(lost_tests) do if redis.call('sismember', processed_key, test) == 0 then + -- Get previous owner before updating + local previous_owner_key = redis.call('hget', owners_key, test) + local previous_owner = nil + if previous_owner_key then + -- Extract worker_id from key format: build::worker::queue + previous_owner = string.match(previous_owner_key, "worker:([^:]+):queue") + end + if use_dynamic_deadline then local dynamic_timeout = redis.call('hget', test_group_timeout_key, test) if not dynamic_timeout or dynamic_timeout == "" then @@ -31,7 +39,13 @@ for _, test in ipairs(lost_tests) do end redis.call('lpush', worker_queue_key, test) redis.call('hset', owners_key, test, worker_queue_key) -- Take ownership - return test + + -- Return test and previous owner (separated by |) + if previous_owner then + return test .. "|" .. previous_owner + else + return test .. "|unknown" + end end end diff --git a/ruby/lib/ci/queue/redis/worker.rb b/ruby/lib/ci/queue/redis/worker.rb index 284d401..3e11a50 100644 --- a/ruby/lib/ci/queue/redis/worker.rb +++ b/ruby/lib/ci/queue/redis/worker.rb @@ -288,7 +288,8 @@ def try_to_reserve_test def try_to_reserve_lost_test current_time = CI::Queue.time_now.to_f - lost_test = eval_script( + + result = eval_script( :reserve_lost, keys: [ key('running'), @@ -300,6 +301,15 @@ def try_to_reserve_lost_test argv: [current_time, timeout, 'true', config.timeout] ) + # Parse result: format is "test_id|previous_owner" or nil + lost_test = nil + previous_owner = nil + if result + parts = result.split('|', 2) + lost_test = parts[0] + previous_owner = parts[1] if parts.length > 1 + end + if lost_test # Check what timeout was used (dynamic or default) dynamic_timeout = redis.hget(key('test-group-timeout'), lost_test) @@ -327,7 +337,10 @@ def try_to_reserve_lost_test "default_timeout=#{config.timeout}s" end - warn "[reserve_lost] test=#{lost_test} current_time=#{current_time_readable} (#{current_time}) deadline=#{deadline_readable} (#{deadline}) gap=#{gap_seconds_formatted}s (#{gap_hours}h#{gap_mins}m#{gap_secs_formatted}s) [#{timeout_details}]" + # Add previous owner information (from Lua script) + previous_owner_info = previous_owner ? "previous_owner=#{previous_owner}" : 'previous_owner=unknown' + + warn "[reserve_lost] test=#{lost_test} current_time=#{current_time_readable} (#{current_time}) deadline=#{deadline_readable} (#{deadline}) gap=#{gap_seconds_formatted}s (#{gap_hours}h#{gap_mins}m#{gap_secs_formatted}s) [#{timeout_details}] [#{previous_owner_info}]" end if lost_test.nil? && idle?