From: Jonas Zeiger Date: Mon, 5 Jul 2021 12:59:57 +0000 (+0200) Subject: ceph-volume: lvm batch: fast_allocations(): avoid ZeroDivisionError X-Git-Tag: v15.2.15~57^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=d2350aa973d3d62d5dd66a7421fb5364c83e490d;p=ceph.git ceph-volume: lvm batch: fast_allocations(): avoid ZeroDivisionError * Fixes Bug #51526 ( https://tracker.ceph.com/issues/51526 ) Signed-off-by: Jonas Zeiger (cherry picked from commit d83d4f35863309637c178197d8a59e746678afba) --- diff --git a/src/ceph-volume/ceph_volume/devices/lvm/batch.py b/src/ceph-volume/ceph_volume/devices/lvm/batch.py index 40c0fea4eec14..789f07d1d990f 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/batch.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/batch.py @@ -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, diff --git a/src/ceph-volume/ceph_volume/tests/conftest.py b/src/ceph-volume/ceph_volume/tests/conftest.py index 2abedac3240db..149afbbc65235 100644 --- a/src/ceph-volume/ceph_volume/tests/conftest.py +++ b/src/ceph-volume/ceph_volume/tests/conftest.py @@ -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 diff --git a/src/ceph-volume/ceph_volume/tests/devices/lvm/test_batch.py b/src/ceph-volume/ceph_volume/tests/devices/lvm/test_batch.py index 7c968ae81d5e5..4bf026ae1f22f 100644 --- a/src/ceph-volume/ceph_volume/tests/devices/lvm/test_batch.py +++ b/src/ceph-volume/ceph_volume/tests/devices/lvm/test_batch.py @@ -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])