Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

No supported way to cancel a job that is already executing!

Đang mở
#806 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
45/100
Loại issue
Tính năng
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
ruby
Lĩnh vực
backend, databases

Hướng nghiên cứu

Look at the SolidQueue::ClaimedExecution class and its discard method that raises UndiscardableError. Understand how jobs are claimed and finalized. The goal is to design a way to signal cancellation to a running job, perhaps by adding a flag or a cooperative check, and to allow discard to work on executing jobs. Review the existing job lifecycle and the finalize method's logic.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Summary

SolidQueue supports cancelling a queued (ready/scheduled) job cleanly via job.discard (as clarified in #395). But there is no supported way to cancel a job that is already executing (claimed) — ClaimedExecution#discard explicitly raises:

def discard
  raise UndiscardableError, "Can't discard a job in progress"
end

In Quepid we have very long "LLM as a judge" type jobs taht could run for many many minutes or hours... And you might say "oh, crap, it's not what I want" and then it's awkward. We wrote a bunch of janky code to support this.

Image

Current behavior

Applications that want a user-facing "Cancel" button for a long-running job (ours: an AI judging run scoped to one book+judge, potentially processing hundreds of records) have no sanctioned way to request cancellation of an already-claimed job. Our workaround bypasses the guard directly:

def self.cancel book, judge
  active_for(book, judge).each do |job|
    if job.claimed_execution.present?
      # Job is actively running — force destroy it. The job's own #perform
      # loop checks for its own SolidQueue row on every iteration and stops
      # as soon as it notices this row is gone.
      job.claimed_execution.destroy
      job.destroy
    else
      job.discard
    end
  end
end

This only works because ClaimedExecution#finalize's unless_already_finalized check (self.class.unscoped.lock.find_by(id: id)) happens to tolerate the claimed_execution row already being gone by the time the job actually finishes — but that's an internal implementation detail we're relying on, not a documented contract, and it could change between versions without notice.

It also means the running job's #perform never gets any signal that cancellation was requested other than a self-written polling loop:

cancellable = SolidQueue::Job.exists?(active_job_id: job_id)
loop do
  break if cancellable && !SolidQueue::Job.exists?(active_job_id: job_id)
  # ... do one unit of work ...
end

There's no cooperative "cancellation requested" flag to check cheaply, and no built-in helper for this pattern either — every app doing cooperative cancellation re-derives the same polling idiom.

Why this belongs in SolidQueue, not application code

ClaimedExecution, #finalize, and the UndiscardableError guard are all internal to SolidQueue; there's no supported extension point for "cancel this specific already-running job" without reaching past that guard into internals that could change between versions.

Related

#395 covers cancelling a scheduled (not-yet-executing) job via discard — this issue is specifically about the claimed/executing case, which that thread doesn't touch.

Ngôn ngữ chính
Ruby
Star
2.5k
Fork
250
Merge trung bình
8 giờ 31 phút
Pull request đã merge (30 ngày)
5

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của rails/solid_queue

Tất cả issue của rails/solid_queue

Issue tương tự

Thêm issue về Ruby

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.