From 99ed78334893a4167e9f39c5c5cc8666a41f6737 Mon Sep 17 00:00:00 2001 From: Pedro Mendes Date: Mon, 10 Nov 2025 10:37:15 -0300 Subject: [PATCH 1/2] Setting `timeout-minutes` to prevent deadlocked actions consuming GH quota --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7485e17e..d7d307f5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,6 +20,7 @@ jobs: tests: name: Tests runs-on: ubuntu-latest + timeout-minutes: 15 strategy: fail-fast: false matrix: From 4a6034fd2cfbef11da58916975f6cfa603703703 Mon Sep 17 00:00:00 2001 From: Pedro Mendes Date: Mon, 10 Nov 2025 10:37:26 -0300 Subject: [PATCH 2/2] Increasing timeout gaps in `processes_lifecycle_test` --- test/integration/processes_lifecycle_test.rb | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/integration/processes_lifecycle_test.rb b/test/integration/processes_lifecycle_test.rb index 1e957c0f..47d56b4d 100644 --- a/test/integration/processes_lifecycle_test.rb +++ b/test/integration/processes_lifecycle_test.rb @@ -58,7 +58,7 @@ class ProcessesLifecycleTest < ActiveSupport::TestCase signal_process(@pid, :TERM, wait: 0.1.second) end - sleep(1.second) + wait_while_with_timeout(SolidQueue.shutdown_timeout + 1.second) { process_exists?(@pid) } assert_clean_termination end @@ -121,14 +121,14 @@ class ProcessesLifecycleTest < ActiveSupport::TestCase test "term supervisor exceeding timeout while there are jobs in-flight" do no_pause = enqueue_store_result_job("no pause") - pause = enqueue_store_result_job("pause", pause: SolidQueue.shutdown_timeout + 10.second) + pause = enqueue_store_result_job("pause", pause: SolidQueue.shutdown_timeout + 10.seconds) wait_while_with_timeout(1.second) { SolidQueue::ReadyExecution.count > 1 } signal_process(@pid, :TERM, wait: 0.5.second) wait_for_jobs_to_finish_for(2.seconds, except: pause) - wait_while_with_timeout!(SolidQueue.shutdown_timeout + 1.second) { process_exists?(@pid) } + wait_while_with_timeout!(SolidQueue.shutdown_timeout + 5.seconds) { process_exists?(@pid) } assert_not process_exists?(@pid) assert_completed_job_results("no pause") @@ -170,10 +170,13 @@ class ProcessesLifecycleTest < ActiveSupport::TestCase enqueue_store_result_job("no exit", :background) enqueue_store_result_job("no exit", :default) end - enqueue_store_result_job("paused no exit", :default, pause: 0.5) - exit_job = enqueue_store_result_job("exit", :background, exit_value: 1, pause: 0.2) - pause_job = enqueue_store_result_job("exit", :background, pause: 0.3) + enqueue_store_result_job("paused no exit", :default, pause: 0.5.second) + # the worker for :background queue will exit abnormally + exit_job = enqueue_store_result_job("exit", :background, exit_value: 1, pause: 0.5.second) + # this will run *after* exit_job (pause: 1.second) - should also be marked as failed + pause_job = enqueue_store_result_job("exit", :background, pause: 1.second) + # this will run *before* exit_job (no pause) - should complete normally 2.times { enqueue_store_result_job("no exit", :background) } wait_for_jobs_to_finish_for(3.seconds, except: [ exit_job, pause_job ]) @@ -228,9 +231,11 @@ class ProcessesLifecycleTest < ActiveSupport::TestCase end test "kill worker individually" do - killed_pause = enqueue_store_result_job("killed_pause", pause: 1.second) + killed_pause = enqueue_store_result_job("killed_pause", pause: 2.seconds) enqueue_store_result_job("pause", :default, pause: 0.5.seconds) + wait_for_jobs_to_finish_for(1.second, except: [ killed_pause ]) + worker = find_processes_registered_as("Worker").detect { |process| process.metadata["queues"].include? "background" } signal_process(worker.pid, :KILL, wait: 0.5.seconds)