]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix race condition in ProcessMonitor
authorMiguel Angel Ajo <mangelajo@redhat.com>
Wed, 10 Dec 2014 11:21:52 +0000 (12:21 +0100)
committerMiguel Angel Ajo <mangelajo@redhat.com>
Thu, 11 Dec 2014 08:05:16 +0000 (09:05 +0100)
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

neutron/agent/linux/external_process.py

index b6b3688e8896292c2ee227a38e21ec97bbe51dff..35053d41a6d1cfe8ec3dec954d0862b5fcd2aa81 100644 (file)
@@ -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: