[lnst] NetTestController: Fix race in _prepare_device()

Jiří Pírko jirka at fedoraproject.org
Wed Aug 22 14:28:14 UTC 2012


commit af16c5e000926d42222c0d5651f19db522c59153
Author: Radek Pazdera <rpazdera at redhat.com>
Date:   Wed Aug 22 13:37:29 2012 +0200

    NetTestController: Fix race in _prepare_device()
    
    This commit fixes possible race condition in _prepare_device()
    that can occur when dynamically attaching interfaces to a libvirt
    domain.
    
    In case the interface already exists the call of wait_for can return
    prematurely and then the following device check will not fail.
    
    Signed-off-by: Radek Pazdera <rpazdera at redhat.com>

 NetTest/NetTestController.py |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)
---
diff --git a/NetTest/NetTestController.py b/NetTest/NetTestController.py
index b39939e..1f86eba 100644
--- a/NetTest/NetTestController.py
+++ b/NetTest/NetTestController.py
@@ -106,8 +106,18 @@ class NetTestController:
                       "Machine '%d' is not virtual." % (machine_id)
                 raise NetTestError(msg)
 
-            if not "hwaddr" in dev:
-                dev["hwaddr"] = self._mac_pool.get_addr()
+            if "hwaddr" in dev:
+                query_result = rpc.get_devices_by_hwaddr(dev["hwaddr"])
+                if query_result:
+                    msg = "Device with hwaddr %s already exists" \
+                                                % dev["hwaddr"]
+                    raise NetTestError(msg)
+            else:
+                while True:
+                    dev["hwaddr"] = self._mac_pool.get_addr()
+                    query_result = rpc.get_devices_by_hwaddr(dev["hwaddr"])
+                    if not len(query_result):
+                        break
 
             if "target_bridge" in dev:
                 brctl = BridgeCtl(dev["target_bridge"])


More information about the LNST-developers mailing list