Petr Horáček has uploaded a new change for review. Change subject: netlink: ignore_enodev parameter in *_info ......................................................................
netlink: ignore_enodev parameter in *_info When we try to get information about the removed device without the cache, _get_link() will end up with ENODEV exception. This case may happen for example when we catch DELLINK event and then try to get info about the deleted link. Now _link/route/addr_functions() have ignore_enodev parameter. If set to True, when ENODEV is raised, _info returns just indexes of devices. Change-Id: I41dfc7178144ae35a6b5bb52c185a337c94138ba Signed-off-by: Petr Horáček <phora...@redhat.com> --- M lib/vdsm/netlink/addr.py M lib/vdsm/netlink/link.py M lib/vdsm/netlink/route.py 3 files changed, 38 insertions(+), 15 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/25/34925/1 diff --git a/lib/vdsm/netlink/addr.py b/lib/vdsm/netlink/addr.py index f63b2b9..019e68a 100644 --- a/lib/vdsm/netlink/addr.py +++ b/lib/vdsm/netlink/addr.py @@ -18,6 +18,7 @@ # from ctypes import (CFUNCTYPE, byref, c_char, c_int, c_void_p, sizeof) from functools import partial +import errno from . import _cache_manager, _nl_cache_get_first, _nl_cache_get_next from . import _int_char_proto, _int_proto, _void_proto @@ -38,17 +39,20 @@ addr = _nl_cache_get_next(addr) -def _addr_info(addr, link_cache=None): +def _addr_info(addr, link_cache=None, ignore_enodev=False): """Returns a dictionary with the address information.""" index = _rtnl_addr_get_ifindex(addr) - return { - 'label': _link_index_to_name(index, cache=link_cache), - 'index': index, - 'family': _af_to_str(_rtnl_addr_get_family(addr)), - 'prefixlen': _rtnl_addr_get_prefixlen(addr), - 'scope': _scope_to_str(_rtnl_addr_get_scope(addr)), - 'flags': _addr_flags(addr), - 'address': _addr_to_str(_rtnl_addr_get_local(addr))} + data = {'index': index, + 'family': _af_to_str(_rtnl_addr_get_family(addr)), + 'prefixlen': _rtnl_addr_get_prefixlen(addr), + 'scope': _scope_to_str(_rtnl_addr_get_scope(addr)), + 'flags': _addr_flags(addr), + 'address': _addr_to_str(_rtnl_addr_get_local(addr))} + try: + data['label'] = _link_index_to_name(index, cache=link_cache), + except IOError as err: + if err.errno != errno.ENODEV or not ignore_enodev: + raise def _addr_flags(addr): diff --git a/lib/vdsm/netlink/link.py b/lib/vdsm/netlink/link.py index 9f42a6a..f819257 100644 --- a/lib/vdsm/netlink/link.py +++ b/lib/vdsm/netlink/link.py @@ -47,7 +47,7 @@ link = _nl_cache_get_next(link) -def _link_info(link, cache=None): +def _link_info(link, cache=None, ignore_enodev=False): """Returns a dictionary with the information of the link object.""" info = {} info['address'] = _addr_to_str(_rtnl_link_get_addr(link)) @@ -64,12 +64,24 @@ underlying_device_index = _rtnl_link_get_link(link) if underlying_device_index > 0: - info['device'] = _link_index_to_name(underlying_device_index, - cache=cache) + try: + info['device'] = _link_index_to_name(underlying_device_index, + cache=cache) + except IOError as err: + if err.errno == errno.ENODEV and ignore_enodev: + info['device_index'] = underlying_device_index + else: + raise master_index = _rtnl_link_get_master(link) if master_index > 0: - info['master'] = _link_index_to_name(master_index, cache=cache) + try: + info['master'] = _link_index_to_name(master_index, cache=cache) + except IOError as err: + if err.errno == errno.ENODEV and ignore_enodev: + info['master_index'] = master_index + else: + raise vlanid = _rtnl_link_vlan_get_id(link) if vlanid >= 0: diff --git a/lib/vdsm/netlink/route.py b/lib/vdsm/netlink/route.py index 604de67..0fa4f36 100644 --- a/lib/vdsm/netlink/route.py +++ b/lib/vdsm/netlink/route.py @@ -19,6 +19,7 @@ from ctypes import CFUNCTYPE, c_int, c_void_p, byref from functools import partial from socket import AF_UNSPEC +import errno from . import _cache_manager, _nl_cache_get_first, _nl_cache_get_next from . import _char_proto, _int_proto, _void_proto @@ -42,7 +43,7 @@ route = _nl_cache_get_next(route) -def _route_info(route, link_cache=None): +def _route_info(route, link_cache=None, ignore_enodev=False): data = { 'destination': _addr_to_str(_rtnl_route_get_dst(route)), # network 'source': _addr_to_str(_rtnl_route_get_src(route)), @@ -52,7 +53,13 @@ 'scope': _scope_to_str(_rtnl_route_get_scope(route))} oif_index = _rtnl_route_get_oif(route) if oif_index > 0: - data['oif'] = _link_index_to_name(oif_index, cache=link_cache) + try: + data['oif'] = _link_index_to_name(oif_index, cache=link_cache) + except IOError as err: + if err.errno == errno.ENODEV and ignore_enodev: + data['oif_index'] = oif_index + else: + raise return data -- To view, visit http://gerrit.ovirt.org/34925 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I41dfc7178144ae35a6b5bb52c185a337c94138ba Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Petr Horáček <phora...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches