From: Miguel Angel Ajo Date: Wed, 10 Dec 2014 11:21:52 +0000 (+0100) Subject: Fix race condition in ProcessMonitor X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=b25915f1d94e19756c932ae18119bdf872cc6316;p=openstack-build%2Fneutron-build.git 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 --- diff --git a/neutron/agent/linux/external_process.py b/neutron/agent/linux/external_process.py index b6b3688e8..35053d41a 100644 --- a/neutron/agent/linux/external_process.py +++ b/neutron/agent/linux/external_process.py @@ -220,7 +220,10 @@ class ProcessMonitor(object): @lockutils.synchronized("_check_child_processes") 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) if pm and not pm.active: