[PATCH rhel7-branch] (v2) Catch race of network device state vs reading its config properties (#919478, #1005681)

Radek Vykydal rvykydal at redhat.com
Tue Sep 10 12:57:12 UTC 2013


Fedora bz: #980576

Catch the infamous

DBusException: org.freedesktop.DBus.Error.UnknownMethod:
Method "Get" with signature "ss" on interface "org.freedesktop.DBus.Properties"
doesn't exist

exception.

Object with path from devices's IPXConfig property is valid only if
its device is in ACTIVATED state.
---
 pyanaconda/nm.py | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/pyanaconda/nm.py b/pyanaconda/nm.py
index dd0df99..0c88800 100644
--- a/pyanaconda/nm.py
+++ b/pyanaconda/nm.py
@@ -53,7 +53,12 @@ class SettingNotFoundError(ValueError):
         return self.__repr__()
 
 class DeviceSettingsNotFoundError(ValueError):
-    """Settings (NMRemoteConnection object was not found"""
+    """Settings NMRemoteConnection object was not found"""
+    def __str__(self):
+        return self.__repr__()
+
+class UnknownMethodGetError(Exception):
+    """Object does not have Get, most probably being invalid"""
     def __str__(self):
         return self.__repr__()
 
@@ -86,6 +91,8 @@ def _get_property(object_path, prop, interface_name_suffix=""):
     except GLib.GError as e:
         if "org.freedesktop.DBus.Error.AccessDenied" in e.message:
             return None
+        elif "org.freedesktop.DBus.Error.UnknownMethod" in e.message:
+            raise UnknownMethodGetError
         else:
             raise
 
@@ -305,7 +312,12 @@ def nm_device_ip_config(name, version=4):
     if config == "/":
         return []
 
-    addresses = _get_property(config, "Addresses", dbus_iface)
+    try:
+        addresses = _get_property(config, "Addresses", dbus_iface)
+    # object is valid only if device is in ACTIVATED state (racy)
+    except UnknownMethodGetError:
+        return []
+
     addr_list = []
     for addr, prefix, gateway in addresses:
         # TODO - look for a library function (could have used IPy but byte order!)
@@ -317,7 +329,12 @@ def nm_device_ip_config(name, version=4):
             gateway_str = nm_dbus_ay_to_ipv6(gateway)
         addr_list.append([addr_str, prefix, gateway_str])
 
-    nameservers = _get_property(config, "Nameservers", dbus_iface)
+    try:
+        nameservers = _get_property(config, "Nameservers", dbus_iface)
+    # object is valid only if device is in ACTIVATED state (racy)
+    except UnknownMethodGetError:
+        return []
+
     ns_list = []
     for ns in nameservers:
         # TODO - look for a library function
@@ -341,7 +358,11 @@ def nm_ntp_servers_from_dhcp():
     for device in active_devices:
         # harvest NTP server addresses from DHCPv4
         dhcp4_path = nm_device_property(device, "Dhcp4Config")
-        options = _get_property(dhcp4_path, "Options", ".DHCP4Config")
+        try:
+            options = _get_property(dhcp4_path, "Options", ".DHCP4Config")
+        # object is valid only if device is in ACTIVATED state (racy)
+        except UnknownMethodGetError:
+            options = None
         if options and 'ntp_servers' in options:
             # NTP server addresses returned by DHCP are whitespace delimited
             ntp_servers_string = options["ntp_servers"]
-- 
1.7.11.7



More information about the anaconda-patches mailing list