diff --git a/app/models/solid_queue/claimed_execution.rb b/app/models/solid_queue/claimed_execution.rb index 9af5fe38..94fd794d 100644 --- a/app/models/solid_queue/claimed_execution.rb +++ b/app/models/solid_queue/claimed_execution.rb @@ -33,13 +33,13 @@ def perform else failed_with(result.error) end - ensure + job.unblock_next_blocked_job end def release transaction do - job.prepare_for_execution + job.dispatch_bypassing_concurrency_limits destroy! end end diff --git a/app/models/solid_queue/job/executable.rb b/app/models/solid_queue/job/executable.rb index b9205486..4dac9d0b 100644 --- a/app/models/solid_queue/job/executable.rb +++ b/app/models/solid_queue/job/executable.rb @@ -73,6 +73,10 @@ def dispatch end end + def dispatch_bypassing_concurrency_limits + ready + end + def finished! if preserve_finished_jobs? touch(:finished_at) diff --git a/app/models/solid_queue/process.rb b/app/models/solid_queue/process.rb index adb79dc6..e0f22758 100644 --- a/app/models/solid_queue/process.rb +++ b/app/models/solid_queue/process.rb @@ -21,8 +21,5 @@ def heartbeat def deregister destroy! - rescue Exception - SolidQueue.logger.error("[SolidQueue] Error deregistering process #{id} - #{metadata}") - raise end end diff --git a/db/migrate/20240110143450_add_missing_index_to_blocked_executions.rb b/db/migrate/20240110143450_add_missing_index_to_blocked_executions.rb new file mode 100644 index 00000000..c6417000 --- /dev/null +++ b/db/migrate/20240110143450_add_missing_index_to_blocked_executions.rb @@ -0,0 +1,5 @@ +class AddMissingIndexToBlockedExecutions < ActiveRecord::Migration[7.1] + def change + add_index :solid_queue_blocked_executions, [ :concurrency_key, :priority, :job_id ], name: "index_solid_queue_blocked_executions_for_release" + end +end diff --git a/lib/solid_queue/processes/runnable.rb b/lib/solid_queue/processes/runnable.rb index 433fce72..ace4f53e 100644 --- a/lib/solid_queue/processes/runnable.rb +++ b/lib/solid_queue/processes/runnable.rb @@ -48,7 +48,7 @@ def do_start_loop run end end - ensure + run_callbacks(:shutdown) { shutdown } end diff --git a/lib/solid_queue/processes/supervised.rb b/lib/solid_queue/processes/supervised.rb index 0d37d5e5..1756a13f 100644 --- a/lib/solid_queue/processes/supervised.rb +++ b/lib/solid_queue/processes/supervised.rb @@ -31,7 +31,7 @@ def register_signal_handlers end trap(:QUIT) do - exit! + exit end end end diff --git a/lib/solid_queue/supervisor.rb b/lib/solid_queue/supervisor.rb index 35a8218f..5e19f331 100644 --- a/lib/solid_queue/supervisor.rb +++ b/lib/solid_queue/supervisor.rb @@ -163,7 +163,7 @@ def wait_until(timeout, condition, &block) if timeout > 0 deadline = monotonic_time_now + timeout - while monotonic_time_now < deadline && !condition.call + while monotonic_time_now <= deadline && !condition.call sleep 0.1 block.call end diff --git a/test/dummy/db/schema.rb b/test/dummy/db/schema.rb index 04eb1ef9..c60d200c 100644 --- a/test/dummy/db/schema.rb +++ b/test/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2023_12_11_200639) do +ActiveRecord::Schema[7.1].define(version: 2024_01_10_143450) do create_table "job_results", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "queue_name" t.string "status" @@ -26,6 +26,7 @@ t.string "concurrency_key", null: false t.datetime "expires_at", null: false t.datetime "created_at", null: false + t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release" t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance" t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true end