Fix race condition in ProcessMonitor
If any new external process was enabled/disabled during the process monitoring loop time, a RuntimeError: dictionary changed size during iteration was thrown. This is fixed by pre-building the service list from the dictionary for the iteration. Closes-Bug: #1401042 Change-Id: Id0a3af22fb85992bde35d8c691bee3ddf435639d
This commit is contained in:
parent
0d5586bd68
commit
96685da7bd
@ -220,7 +220,10 @@ class ProcessMonitor(object):
|
|||||||
|
|
||||||
@lockutils.synchronized("_check_child_processes")
|
@lockutils.synchronized("_check_child_processes")
|
||||||
def _check_child_processes(self):
|
def _check_child_processes(self):
|
||||||
for service_id in self._process_managers:
|
# we build the list of keys before iterating in the loop to cover
|
||||||
|
# the case where other threads add or remove items from the
|
||||||
|
# dictionary which otherwise will cause a RuntimeError
|
||||||
|
for service_id in list(self._process_managers):
|
||||||
pm = self._process_managers.get(service_id)
|
pm = self._process_managers.get(service_id)
|
||||||
|
|
||||||
if pm and not pm.active:
|
if pm and not pm.active:
|
||||||
|
Loading…
Reference in New Issue
Block a user