]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-volume: lvm batch: fast_allocations(): avoid ZeroDivisionError 42181/head
authorJonas Zeiger <jonas.zeiger@talpidae.net>
Mon, 5 Jul 2021 12:59:57 +0000 (14:59 +0200)
committerJonas Zeiger <jonas.zeiger@talpidae.net>
Thu, 22 Jul 2021 09:19:37 +0000 (11:19 +0200)
 * Fixes Bug #51526 ( https://tracker.ceph.com/issues/51526 )

Signed-off-by: Jonas Zeiger <jonas.zeiger@talpidae.net>
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 44909bcf04d7a8ff32a95791c3a1653848c0a11c..75eef9b7451fd6d4771f00d63446eb6a99d2b0a8 100644 (file)
@@ -518,10 +518,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 80f194d4933cedeb047775ecd538d961f68f45f4..357881a53f58f36718120af5c6e61f8893bb5715 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 35c1fd2f8c25d015d41e8a75b9dc3a81d5579b40..507a2f30e19f9376238a465ed7dae2cce90940cc 100644 (file)
@@ -218,6 +218,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])