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:
Miguel Angel Ajo 2014-12-10 12:21:52 +01:00
parent 0d5586bd68
commit 96685da7bd

View File

@ -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: