Skip to content

Commit 2a6675b

Browse files
mnaberezalexsilva
authored andcommitted
Don't report negative uptime for a process if system time changes
Refs Supervisor#281 Refs Supervisor#458 Refs Supervisor#533 Refs Supervisor#552 Refs Supervisor#618 (cherry picked from commit 1c2ea90)
1 parent 821c0f9 commit 2a6675b

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

supervisor/rpcinterface.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,8 @@ def _interpretProcessInfo(self, info):
627627
start_dt = datetime.datetime(*time.gmtime(start)[:6])
628628
now_dt = datetime.datetime(*time.gmtime(now)[:6])
629629
uptime = now_dt - start_dt
630+
if uptime.total_seconds() < 0: # system time set back
631+
uptime = datetime.timedelta(0)
630632
desc = 'pid %s, uptime %s' % (info['pid'], uptime)
631633

632634
elif state in (ProcessStates.FATAL, ProcessStates.BACKOFF):

supervisor/tests/test_rpcinterfaces.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,19 @@ def test__interpretProcessInfo(self):
12101210
description = interface._interpretProcessInfo(stopped2)
12111211
self.assertEqual(description, 'Not started')
12121212

1213+
def test__interpretProcessInfo_doesnt_report_negative_uptime(self):
1214+
supervisord = DummySupervisor()
1215+
interface = self._makeOne(supervisord)
1216+
from supervisor.process import ProcessStates
1217+
running = {'name': 'running',
1218+
'pid': 42,
1219+
'state': ProcessStates.RUNNING,
1220+
'start': _NOW + 10, # started in the future
1221+
'stop': None,
1222+
'now': _NOW}
1223+
description = interface._interpretProcessInfo(running)
1224+
self.assertEqual(description, 'pid 42, uptime 0:00:00')
1225+
12131226
def test_getProcessInfo(self):
12141227
from supervisor.process import ProcessStates
12151228

0 commit comments

Comments
 (0)