]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
ceph-volume: fix a bug in `get_lvm_fast_allocs()` (batch)
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:12:51 +0000 (22:12 +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 0677f9100db541b040ec100819e3a192472e6919..3ecbf8a1fb27d14b2aa77f366b97915d4b170005 100644 (file)
@@ -528,6 +528,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: