diff --git a/0011-tests-Wait-for-raid-and-mirrored-LVs-to-be-synced-be.patch b/0011-tests-Wait-for-raid-and-mirrored-LVs-to-be-synced-be.patch new file mode 100644 index 0000000..938a8a4 --- /dev/null +++ b/0011-tests-Wait-for-raid-and-mirrored-LVs-to-be-synced-be.patch @@ -0,0 +1,278 @@ +From d0ba031e679d480855bea61060acea597d5ffbbd Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 15 Dec 2021 14:14:19 +0100 +Subject: [PATCH 1/2] tests: Wait for raid and mirrored LVs to be synced before + removing + +Resolves: rhbz#2030647 +--- + tests/lvm_dbus_tests.py | 31 +++++++++++++++++++++++++------ + tests/lvm_test.py | 31 +++++++++++++++++++++++++------ + 2 files changed, 50 insertions(+), 12 deletions(-) + +diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py +index 5516afe..5ce653e 100644 +--- a/tests/lvm_dbus_tests.py ++++ b/tests/lvm_dbus_tests.py +@@ -7,6 +7,8 @@ import six + import re + import shutil + import subprocess ++import time ++from contextlib import contextmanager + from distutils.version import LooseVersion + from itertools import chain + +@@ -18,6 +20,21 @@ sb = dbus.SystemBus() + lvm_dbus_running = any("lvmdbus" in name for name in chain(sb.list_names(), sb.list_activatable_names())) + + ++@contextmanager ++def wait_for_sync(vg_name, lv_name): ++ try: ++ yield ++ finally: ++ time.sleep(2) ++ while True: ++ ret, out, _err = run_command("LC_ALL=C lvs -o copy_percent --noheadings %s/%s" % (vg_name, lv_name)) ++ if ret != 0: ++ break ++ if int(float(out)) == 100: ++ break ++ time.sleep(1) ++ ++ + class LVMTestCase(unittest.TestCase): + @classmethod + def setUpClass(cls): +@@ -801,9 +818,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None) + self.assertTrue(succ) + +- # try to create a mirrored LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) +- self.assertTrue(succ) ++ with wait_for_sync("testVG", "testLV"): ++ # try to create a mirrored LV ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) ++ self.assertTrue(succ) + + # verify that the LV has the requested segtype + info = BlockDev.lvm_lvinfo("testVG", "testLV") +@@ -812,9 +830,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None) + self.assertTrue(succ) + +- # try to create a raid1 LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) +- self.assertTrue(succ) ++ with wait_for_sync("testVG", "testLV"): ++ # try to create a raid1 LV ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) ++ self.assertTrue(succ) + + # verify that the LV has the requested segtype + info = BlockDev.lvm_lvinfo("testVG", "testLV") +diff --git a/tests/lvm_test.py b/tests/lvm_test.py +index e349817..12b78ca 100644 +--- a/tests/lvm_test.py ++++ b/tests/lvm_test.py +@@ -7,12 +7,29 @@ import six + import re + import shutil + import subprocess ++import time ++from contextlib import contextmanager + from distutils.version import LooseVersion + + from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, fake_utils, fake_path, TestTags, tag_test, run_command, read_file + from gi.repository import BlockDev, GLib + + ++@contextmanager ++def wait_for_sync(vg_name, lv_name): ++ try: ++ yield ++ finally: ++ time.sleep(2) ++ while True: ++ info = BlockDev.lvm_lvinfo(vg_name, lv_name) ++ if not info: ++ break ++ if info.copy_percent == 100: ++ break ++ time.sleep(1) ++ ++ + class LVMTestCase(unittest.TestCase): + + @classmethod +@@ -737,9 +754,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None) + self.assertTrue(succ) + +- # try to create a mirrored LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) +- self.assertTrue(succ) ++ with wait_for_sync("testVG", "testLV"): ++ # try to create a mirrored LV ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) ++ self.assertTrue(succ) + + # verify that the LV has the requested segtype + info = BlockDev.lvm_lvinfo("testVG", "testLV") +@@ -748,9 +766,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None) + self.assertTrue(succ) + +- # try to create a raid1 LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) +- self.assertTrue(succ) ++ with wait_for_sync("testVG", "testLV"): ++ # try to create a raid1 LV ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) ++ self.assertTrue(succ) + + # verify that the LV has the requested segtype + info = BlockDev.lvm_lvinfo("testVG", "testLV") +-- +2.31.1 + + +From 36dbac970bc4a052dbd97f51eb47379036d15b6e Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Thu, 16 Dec 2021 12:27:33 +0100 +Subject: [PATCH 2/2] tests: Make smaller images for test_lvcreate_type + +We are now waiting for the initial resync for the RAID/mirror LVs +which means we are trying to overwrite the entire 1 GB image which +doesn't fit in /tmp on our CI machines. +--- + tests/lvm_dbus_tests.py | 16 +++++++++++----- + tests/lvm_test.py | 15 ++++++++++----- + 2 files changed, 21 insertions(+), 10 deletions(-) + +diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py +index 5ce653e..723aabb 100644 +--- a/tests/lvm_dbus_tests.py ++++ b/tests/lvm_dbus_tests.py +@@ -313,14 +313,17 @@ class LvmNoDevTestCase(LVMTestCase): + + @unittest.skipUnless(lvm_dbus_running, "LVM DBus not running") + class LvmPVonlyTestCase(LVMTestCase): ++ ++ _sparse_size = 1024**3 ++ + # :TODO: + # * test pvmove (must create two PVs, a VG, a VG and some data in it + # first) + # * some complex test for pvs, vgs, lvs, pvinfo, vginfo and lvinfo + def setUp(self): + self.addCleanup(self._clean_up) +- self.dev_file = create_sparse_tempfile("lvm_test", 1024**3) +- self.dev_file2 = create_sparse_tempfile("lvm_test", 1024**3) ++ self.dev_file = create_sparse_tempfile("lvm_test", self._sparse_size) ++ self.dev_file2 = create_sparse_tempfile("lvm_test", self._sparse_size) + try: + self.loop_dev = create_lio_device(self.dev_file) + except RuntimeError as e: +@@ -795,6 +798,9 @@ class LvmTestLVcreateWithExtra(LvmPVVGLVTestCase): + + @unittest.skipUnless(lvm_dbus_running, "LVM DBus not running") + class LvmTestLVcreateType(LvmPVVGLVTestCase): ++ ++ _sparse_size = 200 * 1024**2 ++ + def test_lvcreate_type(self): + """Verify it's possible to create LVs with various types""" + +@@ -808,7 +814,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + self.assertTrue(succ) + + # try to create a striped LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None) ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None) + self.assertTrue(succ) + + # verify that the LV has the requested segtype +@@ -820,7 +826,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + + with wait_for_sync("testVG", "testLV"): + # try to create a mirrored LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) + self.assertTrue(succ) + + # verify that the LV has the requested segtype +@@ -832,7 +838,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + + with wait_for_sync("testVG", "testLV"): + # try to create a raid1 LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) + self.assertTrue(succ) + + # verify that the LV has the requested segtype +diff --git a/tests/lvm_test.py b/tests/lvm_test.py +index 12b78ca..97f6c69 100644 +--- a/tests/lvm_test.py ++++ b/tests/lvm_test.py +@@ -302,14 +302,17 @@ class LvmNoDevTestCase(LVMTestCase): + BlockDev.lvm_cache_get_mode_from_str("bla") + + class LvmPVonlyTestCase(LVMTestCase): ++ ++ _sparse_size = 1024**3 ++ + # :TODO: + # * test pvmove (must create two PVs, a VG, a VG and some data in it + # first) + # * some complex test for pvs, vgs, lvs, pvinfo, vginfo and lvinfo + def setUp(self): + self.addCleanup(self._clean_up) +- self.dev_file = create_sparse_tempfile("lvm_test", 1024**3) +- self.dev_file2 = create_sparse_tempfile("lvm_test", 1024**3) ++ self.dev_file = create_sparse_tempfile("lvm_test", self._sparse_size) ++ self.dev_file2 = create_sparse_tempfile("lvm_test", self._sparse_size) + try: + self.loop_dev = create_lio_device(self.dev_file) + except RuntimeError as e: +@@ -731,6 +734,8 @@ class LvmTestLVcreateWithExtra(LvmPVVGLVTestCase): + self.assertTrue(succ) + + class LvmTestLVcreateType(LvmPVVGLVTestCase): ++ _sparse_size = 200 * 1024**2 ++ + def test_lvcreate_type(self): + """Verify it's possible to create LVs with various types""" + +@@ -744,7 +749,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + self.assertTrue(succ) + + # try to create a striped LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None) ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None) + self.assertTrue(succ) + + # verify that the LV has the requested segtype +@@ -756,7 +761,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + + with wait_for_sync("testVG", "testLV"): + # try to create a mirrored LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None) + self.assertTrue(succ) + + # verify that the LV has the requested segtype +@@ -768,7 +773,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase): + + with wait_for_sync("testVG", "testLV"): + # try to create a raid1 LV +- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None) + self.assertTrue(succ) + + # verify that the LV has the requested segtype +-- +2.31.1 + diff --git a/libblockdev.spec b/libblockdev.spec index b56671a..9dd4ed4 100644 --- a/libblockdev.spec +++ b/libblockdev.spec @@ -125,7 +125,7 @@ Name: libblockdev Version: 2.25 -Release: 10%{?dist} +Release: 11%{?dist} Summary: A library for low-level manipulation with block devices License: LGPLv2+ URL: https://github.com/storaged-project/libblockdev @@ -141,6 +141,7 @@ Patch7: 0007-lvm-devices-file-support.patch Patch8: 0008-lvm-Fix-reading-statistics-for-VDO-pools-with-VDO-8.patch Patch9: 0009-vdo_stats-Default-to-100-savings-for-invalid-savings.patch Patch10: 0010-Add-support-for-creating-and-activating-integrity-de.patch +Patch11: 0011-tests-Wait-for-raid-and-mirrored-LVs-to-be-synced-be.patch BuildRequires: make BuildRequires: glib2-devel @@ -409,7 +410,7 @@ providing the LVM-related functionality. %package lvm-devel Summary: Development files for the libblockdev-lvm plugin/library Requires: %{name}-lvm%{?_isa} = %{version}-%{release} -Requires: %{name}-utils-devel%{?_isa} +Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release} Requires: glib2-devel %description lvm-devel @@ -433,7 +434,7 @@ providing the LVM-related functionality utilizing the LVM DBus API. %package lvm-dbus-devel Summary: Development files for the libblockdev-lvm-dbus plugin/library Requires: %{name}-lvm-dbus%{?_isa} = %{version}-%{release} -Requires: %{name}-utils-devel%{?_isa} >= 1.4 +Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release} Requires: glib2-devel %description lvm-dbus-devel @@ -703,6 +704,7 @@ A meta-package that pulls all the libblockdev plugins as dependencies. %patch8 -p1 %patch9 -p1 %patch10 -p1 +%patch11 -p1 %build autoreconf -ivf @@ -1006,6 +1008,12 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm} %files plugins-all %changelog +* Mon Jan 10 2022 Vojtech Trefny - 2.25-11 +- tests: Wait for raid and mirrored LVs to be synced before removing + Resolves: rhbz#2030647 +- spec: Require the same version of utils for lvm-devel and lvm-dbus-devel + Resolves: rhbz#2028113 + * Wed Dec 08 2021 Vojtech Trefny - 2.25-10 - Fix reading statistics for VDO pools with VDO 8 Resolves: rhbz#1994220