From 355aa121fffa2ab6d68399af701defa4ef59c0eb Mon Sep 17 00:00:00 2001 From: hamdykhader Date: Wed, 10 Dec 2025 16:39:42 +0300 Subject: [PATCH 1/3] Fix sfam-2504 deletes lvol bdevs that where found in spdk but not in fdb --- simplyblock_core/services/lvol_monitor.py | 71 +++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/simplyblock_core/services/lvol_monitor.py b/simplyblock_core/services/lvol_monitor.py index ddb845169..e75d0b186 100644 --- a/simplyblock_core/services/lvol_monitor.py +++ b/simplyblock_core/services/lvol_monitor.py @@ -8,6 +8,7 @@ from simplyblock_core.models.lvol_model import LVol from simplyblock_core.controllers import health_controller, lvol_events, tasks_controller, lvol_controller from simplyblock_core.models.nvme_device import NVMeDevice +from simplyblock_core.models.snapshot import SnapShot from simplyblock_core.models.storage_node import StorageNode from simplyblock_core.rpc_client import RPCClient @@ -15,6 +16,47 @@ utils.init_sentry_sdk(__name__) + +def create_lvol_for_deletion(bdev_uuid, bdev_alias, snode): + lvol = LVol() + lvol.lvol_name = bdev_uuid + lvol.pool_uuid = db.get_pools(snode.cluster_id)[0].uuid + lvol.ha_type = "ha" + lvol.uuid = bdev_uuid + lvol.lvol_bdev = bdev_alias.split("/")[1] + lvol.nqn = bdev_uuid + lvol.nodes = [snode.get_id(), snode.secondary_node_id] + lvol.lvol_type = 'lvol' + lvol.hostname = snode.hostname + lvol.node_id = snode.get_id() + lvol.lvs_name = snode.lvstore + lvol.subsys_port = snode.lvol_subsys_port + lvol.top_bdev = f"{lvol.lvs_name}/{lvol.lvol_bdev}" + lvol.base_bdev = lvol.top_bdev + lvol.lvol_uuid = bdev_uuid + lvol.status = LVol.STATUS_IN_DELETION + lvol.bdev_stack = [{ + "type": "bdev_lvol", + "name": lvol.lvol_bdev, + "params": { + "name": lvol.lvol_bdev, + "lvs_name": lvol.lvs_name, + "lvol_priority_class": 0}}] + lvol.write_to_db() + + +def create_snapshot_for_deletion(bdev_uuid, bdev_alias, snode): + snap = SnapShot() + snap.uuid = bdev_uuid + snap.snap_uuid = bdev_uuid + snap.pool_uuid = db.get_pools(snode.cluster_id)[0].uuid + snap.cluster_id = snode.cluster_id + snap.snap_name = bdev_uuid + snap.snap_bdev = bdev_alias + snap.status = SnapShot.STATUS_IN_DELETION + snap.write_to_db() + + def set_lvol_status(lvol, status): if lvol.status != status: lvol = db.get_lvol_by_id(lvol.get_id()) @@ -160,6 +202,7 @@ def process_lvol_delete_try_again(lvol): def check_node(snode): + node_bdevs = [] node_bdev_names = [] node_lvols_nqns = {} sec_node_bdev_names = {} @@ -193,8 +236,10 @@ def check_node(snode): if ret: for sub in ret: sec_node_lvols_nqns[sub['nqn']] = sub - + known_bdev_names = [] for lvol in db.get_lvols_by_node_id(snode.get_id()): + if lvol.lvol_uuid: + known_bdev_names.append(lvol.lvol_uuid) if lvol.status == LVol.STATUS_IN_CREATION: continue @@ -330,12 +375,30 @@ def check_node(snode): if passed: set_lvol_status(lvol, LVol.STATUS_ONLINE) - if snode.lvstore_status == "ready": + for snap in db.get_snapshots_by_node_id(snode.get_id()): + if snap.snap_uuid: + known_bdev_names.append(snap.snap_uuid) - for snap in db.get_snapshots_by_node_id(snode.get_id()): - present = health_controller.check_bdev(snap.snap_bdev, bdev_names=node_bdev_names) + present = health_controller.check_bdev(snap.snap_bdev, bdev_names=node_bdev_names) + if snode.lvstore_status == "ready": set_snapshot_health_check(snap, present) + if node_bdevs: + for bdev in node_bdevs: + if bdev["product_name"] == "Logical Volume": + bdev_uuid = bdev["uuid"] + bdev_alias = bdev["aliases"][0] + is_snapshot = bdev["driver_specific"]["lvol"]["snapshot"] + if bdev_uuid not in known_bdev_names: + try: + if is_snapshot: + logger.info(f"Snapshot: {bdev_uuid} not found in fdb, will be deleted") + create_snapshot_for_deletion(bdev_uuid, bdev_alias, snode) + else: + logger.info(f"LVol: {bdev_uuid} not found in fdb, will be deleted") + create_lvol_for_deletion(bdev_uuid, bdev_alias, snode) + except Exception as e: + logger.exception(e) # get DB controller From 52f49c049fd2206bb6a692762b6e08fdb27efca9 Mon Sep 17 00:00:00 2001 From: hamdykhader Date: Wed, 10 Dec 2025 16:43:21 +0300 Subject: [PATCH 2/3] add deleted flag when creating the new objects --- simplyblock_core/services/lvol_monitor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/simplyblock_core/services/lvol_monitor.py b/simplyblock_core/services/lvol_monitor.py index e75d0b186..04ab8f3c5 100644 --- a/simplyblock_core/services/lvol_monitor.py +++ b/simplyblock_core/services/lvol_monitor.py @@ -35,6 +35,7 @@ def create_lvol_for_deletion(bdev_uuid, bdev_alias, snode): lvol.base_bdev = lvol.top_bdev lvol.lvol_uuid = bdev_uuid lvol.status = LVol.STATUS_IN_DELETION + lvol.deleted = True lvol.bdev_stack = [{ "type": "bdev_lvol", "name": lvol.lvol_bdev, @@ -54,6 +55,7 @@ def create_snapshot_for_deletion(bdev_uuid, bdev_alias, snode): snap.snap_name = bdev_uuid snap.snap_bdev = bdev_alias snap.status = SnapShot.STATUS_IN_DELETION + snap.deleted = True snap.write_to_db() From 3b4db7c56bbe2d535d9fd8dffb65a44a76113b26 Mon Sep 17 00:00:00 2001 From: hamdykhader Date: Wed, 10 Dec 2025 16:48:33 +0300 Subject: [PATCH 3/3] Fix cli gen --- simplyblock_cli/scripts/cli-wrapper.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simplyblock_cli/scripts/cli-wrapper.jinja2 b/simplyblock_cli/scripts/cli-wrapper.jinja2 index 423b11992..80932e582 100644 --- a/simplyblock_cli/scripts/cli-wrapper.jinja2 +++ b/simplyblock_cli/scripts/cli-wrapper.jinja2 @@ -5,7 +5,7 @@ import logging import sys import traceback -from simplyblock_cli.clibase import CLIWrapperBase, range_type, regex_type, size_type +from simplyblock_cli.clibase import CLIWrapperBase, range_type, size_type from simplyblock_core import utils class CLIWrapper(CLIWrapperBase):