Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion redis/reserve_lost.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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:<build_id>:worker:<worker_id>: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
Expand All @@ -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

Expand Down
17 changes: 15 additions & 2 deletions ruby/lib/ci/queue/redis/worker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
Expand All @@ -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)
Expand Down Expand Up @@ -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?
Expand Down