Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions queue_job/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import hashlib
import inspect
import logging
import os
import sys
import uuid
from datetime import datetime, timedelta
Expand Down Expand Up @@ -314,6 +315,7 @@ def _load_from_db_record(cls, job_db_record):
if stored.company_id:
job_.company_id = stored.company_id.id
job_.identity_key = stored.identity_key
job_.worker_pid = stored.worker_pid
return job_

def job_record_with_same_identity_key(self):
Expand Down Expand Up @@ -498,6 +500,7 @@ def __init__(
self._eta = None
self.eta = eta
self.channel = channel
self.worker_pid = None

def perform(self):
"""Execute the job.
Expand Down Expand Up @@ -541,6 +544,7 @@ def store(self):
"date_done": False,
"eta": False,
"identity_key": False,
"worker_pid": self.worker_pid,
}

if self.date_enqueued:
Expand Down Expand Up @@ -642,6 +646,7 @@ def set_pending(self, result=None, reset_retry=True):
self.state = PENDING
self.date_enqueued = None
self.date_started = None
self.worker_pid = None
if reset_retry:
self.retry = 0
if result is not None:
Expand All @@ -651,10 +656,12 @@ def set_enqueued(self):
self.state = ENQUEUED
self.date_enqueued = datetime.now()
self.date_started = None
self.worker_pid = None

def set_started(self):
self.state = STARTED
self.date_started = datetime.now()
self.worker_pid = os.getpid()

def set_done(self, result=None):
self.state = DONE
Expand Down
1 change: 1 addition & 0 deletions queue_job/models/queue_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class QueueJob(models.Model):
)

identity_key = fields.Char()
worker_pid = fields.Integer()

def init(self):
self._cr.execute(
Expand Down
1 change: 1 addition & 0 deletions queue_job/views/queue_job_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
groups="base.group_multi_company"
/>
<field name="user_id" />
<field name="worker_pid" groups="base.group_no_one" />
</group>
<group>
<field name="date_created" />
Expand Down
16 changes: 16 additions & 0 deletions test_queue_job/tests/test_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,20 @@ def test_set_started(self):
self.assertEquals(job_a.state, STARTED)
self.assertEquals(job_a.date_started, datetime(2015, 3, 15, 16, 41, 0))

def test_worker_pid(self):
"""When a job is started, it gets the PID of the worker that starts it"""
method = self.env["res.users"].mapped
job_a = Job(method)
self.assertFalse(job_a.worker_pid)
with mock.patch("os.getpid", autospec=True) as mock_getpid:
mock_getpid.return_value = 99999
job_a.set_started()
self.assertEqual(job_a.worker_pid, 99999)

# reset the pid
job_a.set_pending()
self.assertFalse(job_a.worker_pid)

def test_set_done(self):
job_a = Job(self.method)
datetime_path = "odoo.addons.queue_job.job.datetime"
Expand Down Expand Up @@ -180,6 +194,7 @@ def test_read(self):
description="My description",
)
test_job.user_id = 1
test_job.worker_pid = 99999 # normally set on "set_start"
test_job.company_id = self.env.ref("base.main_company").id
test_job.store()
job_read = Job.load(self.env, test_job.uuid)
Expand All @@ -196,6 +211,7 @@ def test_read(self):
self.assertEqual(test_job.result, job_read.result)
self.assertEqual(test_job.user_id, job_read.user_id)
self.assertEqual(test_job.company_id, job_read.company_id)
self.assertEqual(test_job.worker_pid, 99999)
delta = timedelta(seconds=1) # DB does not keep milliseconds
self.assertAlmostEqual(
test_job.date_created, job_read.date_created, delta=delta
Expand Down