[rhel6-branch][PATCH] Fix the display of multipath devices
Vratislav Podzimek
vpodzime at redhat.com
Wed Oct 9 11:21:47 UTC 2013
On Tue, 2013-10-08 at 16:28 -0400, David Shea wrote:
> Handle the case of a multipath device being updated with new members.
>
> Resolves: rhbz#1007641
> Related: rhbz#914637
> ---
> iw/filter_gui.py | 43 ++++++++++++++++++++++++++++++-------------
> 1 file changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/iw/filter_gui.py b/iw/filter_gui.py
> index 1c9dd59..9f6efaf 100644
> --- a/iw/filter_gui.py
> +++ b/iw/filter_gui.py
> @@ -469,23 +469,39 @@ class FilterWindow(InstallWindow):
> # components, just like new_mpaths. That's what populate expects.
> mpaths = []
> for mp in new_mpaths:
> + old_mpaths = []
> + is_new_multipath = False
> +
> for d in mp:
> # If any of the multipath components are in the nonraids cache,
> # remove them from the UI store.
> if d in self._cachedDevices:
> self.depopulate(d)
>
> - # If all components of this multipath device are in the
> - # cache, skip it. Otherwise, perform some additional checks
> - # and then populate the UI.
> - if d not in self._cachedMPaths:
> - # Since we're only tracking mpaths by their members, we
> - # have no way of knowing whether the mpath the disk
> - # belongs to is already in the UI, so check for it here
> - # before creating a new mpath device.
> - if udev_device_get_multipath_name(d) is None:
> - mpaths.append(mp)
> - break
> + # Check whether this device is part of an existing multipath,
> + # but as part of a different set of members
> + if d in self._cachedMPathMembers and hasattr(self._cachedMPaths, d["name"]):
> + if self._cachedMPaths[d["name"]] != mp:
> + old_mpaths.append(mp)
> + is_new_multipath = True
> +
> + # Check whether this is a new device
> + if d not in self._cachedMPathMembers:
> + is_new_multipath = True
> +
> + for omp in old_mpaths:
> + # Clean up the caches
> + for d in omp:
> + del self._cachedMPathMembers[self._cachedMPathMembers.index(d)]
> + del self._cachedMPaths[d["name"]]
> + self.depopulate(d)
> +
> + if is_new_multipath:
> + mpaths.append(mp)
> +
> + # Add the multipath to the cache
> + for d in mp:
> + self._cachedMPaths[d["name"]] = mp
>
> nonraids = filter(lambda d: d not in self._cachedDevices, new_nonraids)
> raids = filter(lambda d: d not in self._cachedRaidDevices, new_raids)
> @@ -501,7 +517,7 @@ class FilterWindow(InstallWindow):
> # And then we need to do the same list flattening trick here as in
> # getScreen.
> lst = list(itertools.chain(*mpaths))
> - self._cachedMPaths.extend(lst)
> + self._cachedMPathMembers.extend(lst)
>
> def _makeBasic(self):
> np = NotebookPage(self.store, "basic", self.xml, Callbacks(self.xml))
> @@ -668,7 +684,8 @@ class FilterWindow(InstallWindow):
> # to flatten it into a single list of all components of all multipaths
> # and store that.
> lst = list(itertools.chain(*mpaths))
> - self._cachedMPaths = NameCache(lst)
> + self._cachedMPathMembers = NameCache(lst)
> + self._cachedMPaths = {}
>
> # Switch to the first notebook page that displays any devices.
> i = 0
The code looks crazy, but the changes look okay. ACK.
--
Vratislav Podzimek
Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic
More information about the anaconda-patches
mailing list