From b25915f1d94e19756c932ae18119bdf872cc6316 Mon Sep 17 00:00:00 2001 From: Miguel Angel Ajo Date: Wed, 10 Dec 2014 12:21:52 +0100 Subject: [PATCH] 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 --- neutron/agent/linux/external_process.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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: -- 2.45.2