diff --git a/rq/job.py b/rq/job.py index bb61fc4..ce1894b 100644 --- a/rq/job.py +++ b/rq/job.py @@ -473,11 +473,13 @@ class Job(object): without worrying about the internals required to implement job cancellation. """ - from .queue import Queue + from .queue import Queue, get_failed_queue pipeline = self.connection._pipeline() if self.origin: - queue = Queue(name=self.origin, connection=self.connection) - queue.remove(self, pipeline=pipeline) + q = (get_failed_queue(connection=self.connection) + if self.is_failed + else Queue(name=self.origin, connection=self.connection)) + q.remove(self, pipeline=pipeline) pipeline.execute() def delete(self, pipeline=None, remove_from_queue=True): diff --git a/tests/test_job.py b/tests/test_job.py index 30917ee..413039d 100644 --- a/tests/test_job.py +++ b/tests/test_job.py @@ -11,7 +11,7 @@ from tests.helpers import strip_microseconds from rq.compat import PY2, as_text from rq.exceptions import NoSuchJobError, UnpickleError from rq.job import Job, get_current_job, JobStatus, cancel_job -from rq.queue import Queue +from rq.queue import Queue, get_failed_queue from rq.registry import DeferredJobRegistry from rq.utils import utcformat from rq.worker import Worker @@ -435,3 +435,12 @@ class TestJob(RQTestCase): self.assertEqual(1, len(queue.get_jobs())) cancel_job(job.id) self.assertEqual(0, len(queue.get_jobs())) + + def test_create_failed_and_cancel_job(self): + """test creating and using cancel_job deletes job properly""" + failed = get_failed_queue(connection=self.testconn) + job = failed.enqueue(fixtures.say_hello) + job.set_status(JobStatus.FAILED) + self.assertEqual(1, len(failed.get_jobs())) + cancel_job(job.id) + self.assertEqual(0, len(failed.get_jobs()))