Skip to content

Commit d075fe5

Browse files
authored
Merge pull request #200 from davekch/192-check-jobstore-before-handling-event
prevent DjangoResultsStoreMixin from handling events of other jobstores
2 parents 62e3837 + 23ca0c0 commit d075fe5

File tree

2 files changed

+24
-21
lines changed

2 files changed

+24
-21
lines changed

django_apscheduler/jobstores.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,20 @@ def start(self, scheduler, alias):
3636

3737
self.register_event_listeners()
3838

39-
@classmethod
40-
def handle_submission_event(cls, event: JobSubmissionEvent):
39+
def handle_submission_event(self, event: JobSubmissionEvent):
4140
"""
4241
Create and return new job execution instance in the database when the job is submitted to the scheduler.
4342
4443
:param event: JobExecutionEvent instance
4544
:return: DjangoJobExecution ID or None if the job execution could not be logged.
4645
"""
46+
if event.jobstore != self._alias:
47+
return None
4748
try:
4849
if event.code == events.EVENT_JOB_SUBMITTED:
4950
# Start logging a new job execution
5051
job_execution = DjangoJobExecution.atomic_update_or_create(
51-
cls.lock,
52+
self.lock,
5253
event.job_id,
5354
event.scheduled_run_times[0],
5455
DjangoJobExecution.SENT,
@@ -63,7 +64,7 @@ def handle_submission_event(cls, event: JobSubmissionEvent):
6364
)
6465

6566
job_execution = DjangoJobExecution.atomic_update_or_create(
66-
cls.lock,
67+
self.lock,
6768
event.job_id,
6869
event.scheduled_run_times[0],
6970
status,
@@ -82,14 +83,15 @@ def handle_submission_event(cls, event: JobSubmissionEvent):
8283

8384
return job_execution.id
8485

85-
@classmethod
86-
def handle_execution_event(cls, event: JobExecutionEvent) -> Union[int, None]:
86+
def handle_execution_event(self, event: JobExecutionEvent) -> Union[int, None]:
8787
"""
8888
Store "successful" job execution status in the database.
8989
9090
:param event: JobExecutionEvent instance
9191
:return: DjangoJobExecution ID or None if the job execution could not be logged.
9292
"""
93+
if event.jobstore != self._alias:
94+
return None
9395
if event.code != events.EVENT_JOB_EXECUTED:
9496
raise NotImplementedError(
9597
f"Don't know how to handle JobExecutionEvent '{event.code}'. Expected "
@@ -98,7 +100,7 @@ def handle_execution_event(cls, event: JobExecutionEvent) -> Union[int, None]:
98100

99101
try:
100102
job_execution = DjangoJobExecution.atomic_update_or_create(
101-
cls.lock,
103+
self.lock,
102104
event.job_id,
103105
event.scheduled_run_time,
104106
DjangoJobExecution.SUCCESS,
@@ -111,14 +113,15 @@ def handle_execution_event(cls, event: JobExecutionEvent) -> Union[int, None]:
111113

112114
return job_execution.id
113115

114-
@classmethod
115-
def handle_error_event(cls, event: JobExecutionEvent) -> Union[int, None]:
116+
def handle_error_event(self, event: JobExecutionEvent) -> Union[int, None]:
116117
"""
117118
Store "failed" job execution status in the database.
118119
119120
:param event: JobExecutionEvent instance
120121
:return: DjangoJobExecution ID or None if the job execution could not be logged.
121122
"""
123+
if event.jobstore != self._alias:
124+
return None
122125
try:
123126
if event.code == events.EVENT_JOB_ERROR:
124127

@@ -130,7 +133,7 @@ def handle_error_event(cls, event: JobExecutionEvent) -> Union[int, None]:
130133
traceback = None
131134

132135
job_execution = DjangoJobExecution.atomic_update_or_create(
133-
cls.lock,
136+
self.lock,
134137
event.job_id,
135138
event.scheduled_run_time,
136139
DjangoJobExecution.ERROR,
@@ -144,7 +147,7 @@ def handle_error_event(cls, event: JobExecutionEvent) -> Union[int, None]:
144147
exception = f"Run time of job '{event.job_id}' was missed!"
145148

146149
job_execution = DjangoJobExecution.atomic_update_or_create(
147-
cls.lock,
150+
self.lock,
148151
event.job_id,
149152
event.scheduled_run_time,
150153
status,

tests/test_jobstores.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def test_start_gets_scheduler_lock(self):
2828
@pytest.mark.django_db
2929
def test_handle_submission_event_not_supported_raises_exception(self, jobstore):
3030
event = JobSubmissionEvent(
31-
events.EVENT_ALL, "test_job", jobstore, [timezone.now()]
31+
events.EVENT_ALL, "test_job", jobstore._alias, [timezone.now()]
3232
)
3333

3434
with pytest.raises(NotImplementedError):
@@ -46,7 +46,7 @@ def test_handle_submission_event_creates_job_execution(
4646
self, event_code, jobstore, create_add_job
4747
):
4848
job = create_add_job(jobstore, dummy_job, datetime(2016, 5, 3))
49-
event = JobSubmissionEvent(event_code, job.id, jobstore, [timezone.now()])
49+
event = JobSubmissionEvent(event_code, job.id, jobstore._alias, [timezone.now()])
5050
jobstore.handle_submission_event(event)
5151

5252
assert DjangoJobExecution.objects.filter(job_id=event.job_id).exists()
@@ -56,7 +56,7 @@ def test_handle_submission_event_for_job_that_no_longer_exists_does_not_raise_ex
5656
self, jobstore
5757
):
5858
event = JobSubmissionEvent(
59-
events.EVENT_JOB_SUBMITTED, "finished_job", jobstore, [timezone.now()]
59+
events.EVENT_JOB_SUBMITTED, "finished_job", jobstore._alias, [timezone.now()]
6060
)
6161
jobstore.handle_submission_event(event)
6262

@@ -65,7 +65,7 @@ def test_handle_submission_event_for_job_that_no_longer_exists_does_not_raise_ex
6565
@pytest.mark.django_db
6666
def test_handle_execution_event_not_supported_raises_exception(self, jobstore):
6767
event = JobExecutionEvent(
68-
events.EVENT_ALL, "test_job", jobstore, timezone.now()
68+
events.EVENT_ALL, "test_job", jobstore._alias, timezone.now()
6969
)
7070

7171
with pytest.raises(NotImplementedError):
@@ -77,7 +77,7 @@ def test_handle_execution_event_creates_job_execution(
7777
):
7878
job = create_add_job(jobstore, dummy_job, datetime(2016, 5, 3))
7979
event = JobExecutionEvent(
80-
events.EVENT_JOB_EXECUTED, job.id, jobstore, timezone.now()
80+
events.EVENT_JOB_EXECUTED, job.id, jobstore._alias, timezone.now()
8181
)
8282
jobstore.handle_execution_event(event)
8383

@@ -89,7 +89,7 @@ def test_handle_execution_event_for_job_that_no_longer_exists_does_not_raise_exc
8989
):
9090
# Test for regression https://github.com/jcass77/django-apscheduler/issues/116
9191
event = JobExecutionEvent(
92-
events.EVENT_JOB_EXECUTED, "finished_job", jobstore, timezone.now()
92+
events.EVENT_JOB_EXECUTED, "finished_job", jobstore._alias, timezone.now()
9393
)
9494
jobstore.handle_execution_event(event)
9595

@@ -98,7 +98,7 @@ def test_handle_execution_event_for_job_that_no_longer_exists_does_not_raise_exc
9898
@pytest.mark.django_db
9999
def test_handle_error_event_not_supported_raises_exception(self, jobstore):
100100
event = JobExecutionEvent(
101-
events.EVENT_ALL, "test_job", jobstore, timezone.now()
101+
events.EVENT_ALL, "test_job", jobstore._alias, timezone.now()
102102
)
103103

104104
with pytest.raises(NotImplementedError):
@@ -116,7 +116,7 @@ def test_handle_error_event_creates_job_execution(
116116
self, jobstore, create_add_job, event_code
117117
):
118118
job = create_add_job(jobstore, dummy_job, datetime(2016, 5, 3))
119-
event = JobExecutionEvent(event_code, job.id, jobstore, timezone.now())
119+
event = JobExecutionEvent(event_code, job.id, jobstore._alias, timezone.now())
120120
jobstore.handle_error_event(event)
121121

122122
assert DjangoJobExecution.objects.filter(job_id=event.job_id).exists()
@@ -127,7 +127,7 @@ def test_handle_error_event_no_exception_sets_exception_text(
127127
):
128128
job = create_add_job(jobstore, dummy_job, datetime(2016, 5, 3))
129129
event = JobExecutionEvent(
130-
events.EVENT_JOB_ERROR, job.id, jobstore, timezone.now()
130+
events.EVENT_JOB_ERROR, job.id, jobstore._alias, timezone.now()
131131
)
132132
jobstore.handle_error_event(event)
133133

@@ -140,7 +140,7 @@ def test_handle_error_event_for_job_that_no_longer_exists_does_not_raise_excepti
140140
self, jobstore
141141
):
142142
event = JobExecutionEvent(
143-
events.EVENT_JOB_ERROR, "finished_job", jobstore, timezone.now()
143+
events.EVENT_JOB_ERROR, "finished_job", jobstore._alias, timezone.now()
144144
)
145145
jobstore.handle_error_event(event)
146146

0 commit comments

Comments
 (0)