]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-volume: lvm batch: fast_allocations(): avoid ZeroDivisionError 42494/head
authorJonas Zeiger <jonas.zeiger@talpidae.net>
Mon, 5 Jul 2021 12:59:57 +0000 (14:59 +0200)
committerDimitri Savineau <dsavinea@redhat.com>
Mon, 26 Jul 2021 21:02:08 +0000 (17:02 -0400)
 * Fixes Bug #51526 ( https://tracker.ceph.com/issues/51526 )

Signed-off-by: Jonas Zeiger <jonas.zeiger@talpidae.net>
(cherry picked from commit d83d4f35863309637c178197d8a59e746678afba)

src/ceph-volume/ceph_volume/devices/lvm/batch.py
src/ceph-volume/ceph_volume/tests/conftest.py
src/ceph-volume/ceph_volume/tests/devices/lvm/test_batch.py

index 40c0fea4eec148d03715346bcbf552a8bd211662..789f07d1d990f62529bd814f8f751a92998e55be 100644 (file)
@@ -511,10 +511,11 @@ class Batch(object):
         # fill up uneven distributions across fast devices: 5 osds and 2 fast
         # devices? create 3 slots on each device rather then deploying
         # heterogeneous osds
-        if (requested_osds - len(lvm_devs)) % len(phys_devs):
-            fast_slots_per_device = int((requested_osds - len(lvm_devs)) / len(phys_devs)) + 1
+        slot_divider = max(1, len(phys_devs))
+        if (requested_osds - len(lvm_devs)) % slot_divider:
+            fast_slots_per_device = int((requested_osds - len(lvm_devs)) / slot_divider) + 1
         else:
-            fast_slots_per_device = int((requested_osds - len(lvm_devs)) / len(phys_devs))
+            fast_slots_per_device = int((requested_osds - len(lvm_devs)) / slot_divider)
 
 
         ret.extend(get_physical_fast_allocs(phys_devs,
index 2abedac3240dbc20942b7dfa39cc898fa2d1879e..149afbbc6523568f2559f0337afa96fc81a9c34c 100644 (file)
@@ -52,6 +52,8 @@ def mock_lv_device_generator():
         dev.used_by_ceph = False
         dev.vg_size = [size]
         dev.vg_free = dev.vg_size
+        dev.available_lvm = True
+        dev.is_device = False
         dev.lvs = [lvm.Volume(vg_name=dev.vg_name, lv_name=dev.lv_name, lv_size=size, lv_tags='')]
         return dev
     return mock_lv
index 7c968ae81d5e5b7f9d5db00b42a855a487b20c9b..4bf026ae1f22fd42f542b4247a5590a6a28de8d1 100644 (file)
@@ -209,6 +209,15 @@ class TestBatch(object):
                                               'block_db', 2, 2, args)
         assert len(fast) == 2
 
+    def test_batch_fast_allocations_one_block_db_length(self, factory, conf_ceph_stub,
+                                                  mock_lv_device_generator):
+        conf_ceph_stub('[global]\nfsid=asdf-lkjh')
+
+        b = batch.Batch([])
+        db_lv_devices = [mock_lv_device_generator()]
+        fast = b.fast_allocations(db_lv_devices, 1, 0, 'block_db')
+        assert len(fast) == 1
+
     @pytest.mark.parametrize('occupied_prior', range(7))
     @pytest.mark.parametrize('slots,num_devs',
                              [l for sub in [list(zip([x]*x, range(1, x + 1))) for x in range(1,7)] for l in sub])