]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-volume: fix a bug in `get_lvm_fast_allocs()` (batch) 52062/head
authorGuillaume Abrioux <gabrioux@ibm.com>
Thu, 4 May 2023 08:08:09 +0000 (10:08 +0200)
committerGuillaume Abrioux <gabrioux@ibm.com>
Wed, 14 Jun 2023 20:13:25 +0000 (22:13 +0200)
`get_lvm_fast_allocs()` in `devices/lvm/batch.py` calls the property
`Device.used_by_ceph` in order to filter out devices that are already
used by ceph. The issue is that `Device.used_by_ceph()` itself filters
out journal devices (db/wal) given that a db/wal device can be shared
between multiple OSDs. The consequence is that `Device.used_by_ceph()`
always returns False for a db/wal device (even if it is actually
already used by ceph) so `get_lvm_fast_allocs()` always returns the
full list of the passed db/wal devices on the `lvm batch` CLI command.
Finally, the logic in `devices.lvm.batch.get_deployment_layout()`
checks whether the length of the list returned by `get_lvm_fast_allocs()`
is equal to `num_osds` (the number of OSD being created), if not it fails.

Fixes: https://tracker.ceph.com/issues/59640
Signed-off-by: Guillaume Abrioux <gabrioux@ibm.com>
(cherry picked from commit 8da98bf2ac8cf223904acd971f3a0342bdbd26f9)

src/ceph-volume/ceph_volume/devices/lvm/batch.py
src/ceph-volume/ceph_volume/util/device.py

index 9ed2bf2fccf43d2a93bb99dfc9b02c4001bda590..d867fe2d87e3bb33c30bbce277433095449d80f1 100644 (file)
@@ -171,7 +171,7 @@ def group_devices_by_vg(devices):
 def get_lvm_fast_allocs(lvs):
     return [("{}/{}".format(d.vg_name, d.lv_name), 100.0,
              disk.Size(b=int(d.lvs[0].lv_size)), 1) for d in lvs if not
-            d.used_by_ceph]
+            d.journal_used_by_ceph]
 
 
 class Batch(object):
index 015cfe6ff607c497176d9e73f910a9cb19f56a7a..c9324e7776c8a4e248b1b7e76b3520a13765c1f5 100644 (file)
@@ -524,6 +524,15 @@ class Device(object):
                    if lv.tags.get("ceph.type") in ["data", "block"]]
         return any(osd_ids)
 
+    @property
+    def journal_used_by_ceph(self):
+        # similar to used_by_ceph() above. This is for 'journal' devices (db/wal/..)
+        # needed by get_lvm_fast_allocs() in devices/lvm/batch.py
+        # see https://tracker.ceph.com/issues/59640
+        osd_ids = [lv.tags.get("ceph.osd_id") is not None for lv in self.lvs
+                   if lv.tags.get("ceph.type") in ["db", "wal"]]
+        return any(osd_ids)
+
     @property
     def vg_free_percent(self):
         if self.vgs: