diff --git a/0001-Avoid-using-unnecessary-udev-settle-calls.patch b/0001-Avoid-using-unnecessary-udev-settle-calls.patch new file mode 100644 index 0000000..0f130f6 --- /dev/null +++ b/0001-Avoid-using-unnecessary-udev-settle-calls.patch @@ -0,0 +1,151 @@ +From dae3375e720fe67870fe92e0aecd9638726c4d43 Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 9 Sep 2020 15:26:39 +0200 +Subject: [PATCH 1/2] Try to not use udev.resolve_devspec when querying + MountsCache + +udev.resolve_devspec is slow and uses udev.settle, we should avoid +using it if possible when getting system mountpoints. +--- + blivet/mounts.py | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/blivet/mounts.py b/blivet/mounts.py +index 7ce41d77..ef2def89 100644 +--- a/blivet/mounts.py ++++ b/blivet/mounts.py +@@ -27,6 +27,8 @@ + import logging + log = logging.getLogger("blivet") + ++import os ++ + + class _MountinfoCache(object): + +@@ -113,6 +115,12 @@ def get_mountpoints(self, devspec, subvolspec=None): + + # devspec == None means "get 'nodev' mount points" + if devspec not in (None, "tmpfs"): ++ if devspec.startswith("/dev"): ++ # try to avoid using resolve_devspec if possible ++ name = os.path.realpath(devspec).split("/")[-1] ++ if (name, subvolspec) in self.mountpoints.keys(): ++ return self.mountpoints[(name, subvolspec)] ++ + # use the canonical device path (if available) + canon_devspec = resolve_devspec(devspec, sysname=True) + if canon_devspec is not None: + +From ae32d008e7425610d437c72bb284664ace7ce5b7 Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 9 Sep 2020 15:27:57 +0200 +Subject: [PATCH 2/2] Do not run udev.settle in StorageDevice._pre_teardown + +We currently run udev.settle for every _pre_teardown call even if +there is no change or format teardown. This commit moves the +udev.settle call to format classes so it is called only when +format.teardown calls in _pre_teardown change the format. +--- + blivet/devices/storage.py | 1 - + blivet/formats/fs.py | 2 ++ + blivet/formats/luks.py | 5 +++++ + blivet/formats/swap.py | 3 +++ + tests/devices_test/device_methods_test.py | 2 -- + 5 files changed, 10 insertions(+), 3 deletions(-) + +diff --git a/blivet/devices/storage.py b/blivet/devices/storage.py +index d47affca..bde0b7d6 100644 +--- a/blivet/devices/storage.py ++++ b/blivet/devices/storage.py +@@ -425,7 +425,6 @@ def _pre_teardown(self, recursive=None): + self.original_format.teardown() + if self.format.exists: + self.format.teardown() +- udev.settle() + return True + + def _teardown(self, recursive=None): +diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py +index 9c14649e..d351dee1 100644 +--- a/blivet/formats/fs.py ++++ b/blivet/formats/fs.py +@@ -614,6 +614,8 @@ def _teardown(self, **kwargs): + if mountpoint == self._chrooted_mountpoint: + self._chrooted_mountpoint = None + ++ udev.settle() ++ + def read_label(self): + """Read this filesystem's label. + +diff --git a/blivet/formats/luks.py b/blivet/formats/luks.py +index de9f1d32..0d036588 100644 +--- a/blivet/formats/luks.py ++++ b/blivet/formats/luks.py +@@ -36,6 +36,7 @@ + from ..tasks import availability, lukstasks + from ..size import Size, KiB + from ..static_data import luks_data ++from .. import udev + + import logging + log = logging.getLogger("blivet") +@@ -275,6 +276,8 @@ def _teardown(self, **kwargs): + log.debug("unmapping %s", self.map_name) + blockdev.crypto.luks_close(self.map_name) + ++ udev.settle() ++ + def _pre_resize(self): + if self.luks_version == "luks2" and not self.has_key: + raise LUKSError("Passphrase or key needs to be set before resizing LUKS2 format.") +@@ -442,5 +445,7 @@ def _teardown(self, **kwargs): + # for all devices supported by cryptsetup + blockdev.crypto.luks_close(self.map_name) + ++ udev.settle() ++ + + register_device_format(Integrity) +diff --git a/blivet/formats/swap.py b/blivet/formats/swap.py +index 3cc59138..2e4b07df 100644 +--- a/blivet/formats/swap.py ++++ b/blivet/formats/swap.py +@@ -29,6 +29,7 @@ + from ..tasks import fsuuid + from . import DeviceFormat, register_device_format + from ..size import Size ++from .. import udev + + import gi + gi.require_version("BlockDev", "2.0") +@@ -206,6 +207,8 @@ def _teardown(self, **kwargs): + type=self.type, status=self.status) + blockdev.swap.swapoff(self.device) + ++ udev.settle() ++ + def _create(self, **kwargs): + log_method_call(self, device=self.device, + type=self.type, status=self.status) +diff --git a/tests/devices_test/device_methods_test.py b/tests/devices_test/device_methods_test.py +index e6718121..f00509be 100644 +--- a/tests/devices_test/device_methods_test.py ++++ b/tests/devices_test/device_methods_test.py +@@ -161,7 +161,6 @@ def _destroy(): + + self.assertFalse(self.device.exists) + self.assertEqual(self.device.update_sysfs_path.called, self.destroy_updates_sysfs_path) +- self.assertEqual(self.patches["udev"].settle.called, self.destroy_calls_udev_settle) + self.patches["udev"].reset_mock() + self.device.update_sysfs_path.reset_mock() + +@@ -228,7 +227,6 @@ def test_teardown(self): + self.device.teardown() + self.assertTrue(self.teardown_method_mock.called) + +- self.assertEqual(self.patches["udev"].settle.called, self.teardown_calls_udev_settle) + self.assertEqual(self.device.update_sysfs_path.called, self.teardown_updates_sysfs_path) + self.patches["udev"].reset_mock() + self.device.update_sysfs_path.reset_mock() diff --git a/python-blivet.spec b/python-blivet.spec index 24de81f..7971452 100644 --- a/python-blivet.spec +++ b/python-blivet.spec @@ -23,13 +23,14 @@ Version: 3.3.0 #%%global prerelease .b2 # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 -Release: 1%{?prerelease}%{?dist} +Release: 2%{?prerelease}%{?dist} Epoch: 1 License: LGPLv2+ %global realname blivet %global realversion %{version}%{?prerelease} Source0: http://github.com/storaged-project/blivet/archive/%{realname}-%{realversion}.tar.gz Source1: http://github.com/storaged-project/blivet/archive/%{realname}-%{realversion}-tests.tar.gz +Patch0: 0001-Avoid-using-unnecessary-udev-settle-calls.patch # Versions of required components (done so we make sure the buildrequires # match the requires versions of things). @@ -191,6 +192,9 @@ configuration. %endif %changelog +* Wed Sep 16 2020 Vojtech Trefny - 3.3.0-2 +- Avoid using unnecessary udev.settle calls (#1876162) + * Thu Aug 20 2020 Vojtech Trefny - 3.3.0-1 - Account for pmspare grow when adjusting thinpool metadata size (vtrefny) - Fix ignoring disk devices with parents or children (vtrefny)