From 1f5568f3b7102677aa97783331e05d828aa4c766 Mon Sep 17 00:00:00 2001 From: Geoffrey Israel Date: Wed, 5 Nov 2025 14:21:53 +0100 Subject: [PATCH 1/6] do not auto add default qos class (#720) * added 3 secs sleep before add qos class * wip * Revert "wip" This reverts commit b0f2ba695f778f5eb177fab8a474210e12b0c69a. * increase sleep time * remove auto add default qos class --------- Co-authored-by: hamdykhader --- simplyblock_core/cluster_ops.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/simplyblock_core/cluster_ops.py b/simplyblock_core/cluster_ops.py index 103123934..fbe91a58f 100644 --- a/simplyblock_core/cluster_ops.py +++ b/simplyblock_core/cluster_ops.py @@ -371,8 +371,6 @@ def create_cluster(blk_size, page_size_in_blocks, cli_pass, cluster.write_to_db(db_controller.kv_store) - qos_controller.add_class("Default", 100, cluster.get_id()) - cluster_events.cluster_create(cluster) mgmt_node_ops.add_mgmt_node(dev_ip, mode, cluster.uuid) From 3af633b009d706c07e7526e36c5ab744c28e5041 Mon Sep 17 00:00:00 2001 From: Geoffrey Israel Date: Wed, 5 Nov 2025 14:30:53 +0100 Subject: [PATCH 2/6] Update env_var (#721) --- simplyblock_core/env_var | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simplyblock_core/env_var b/simplyblock_core/env_var index f3e377ee4..e1d2e2f8b 100644 --- a/simplyblock_core/env_var +++ b/simplyblock_core/env_var @@ -1,5 +1,5 @@ SIMPLY_BLOCK_COMMAND_NAME=sbcli-dev -SIMPLY_BLOCK_VERSION=19.2.23 +SIMPLY_BLOCK_VERSION=19.2.24 SIMPLY_BLOCK_DOCKER_IMAGE=public.ecr.aws/simply-block/simplyblock:main SIMPLY_BLOCK_SPDK_ULTRA_IMAGE=public.ecr.aws/simply-block/ultra:main-latest From ad546ca5fe667a74a5559109fb0e7c58d3a707b0 Mon Sep 17 00:00:00 2001 From: "Hamdy H. Khader" Date: Tue, 11 Nov 2025 10:04:15 +0300 Subject: [PATCH 3/6] Enable ndcs and npcs when creating lvol (#729) --- simplyblock_core/rpc_client.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/simplyblock_core/rpc_client.py b/simplyblock_core/rpc_client.py index 62f37b1e9..66ef478f8 100644 --- a/simplyblock_core/rpc_client.py +++ b/simplyblock_core/rpc_client.py @@ -379,11 +379,11 @@ def create_lvol(self, name, size_in_mib, lvs_name, lvol_priority_class=0, ndcs=0 "clear_method": "unmap", "lvol_priority_class": lvol_priority_class, } - # if ndcs or npcs: - # params.update({ - # 'ndcs' : ndcs, - # 'npcs' : npcs, - # }) + if ndcs or npcs: + params.update({ + 'ndcs' : ndcs, + 'npcs' : npcs, + }) return self._request("bdev_lvol_create", params) def delete_lvol(self, name, del_async=False): From 5f6382b008c437d67b8e92d9a7324a1391b3dd7a Mon Sep 17 00:00:00 2001 From: "Hamdy H. Khader" Date: Tue, 11 Nov 2025 11:05:47 +0300 Subject: [PATCH 4/6] Fix sfam-2450 cluster update issues (#726) - set cluster mode to default "docker" - remove service "app_CachingNodeMonitor" from services during cluster update --- simplyblock_core/cluster_ops.py | 10 +++++++--- simplyblock_core/models/cluster.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/simplyblock_core/cluster_ops.py b/simplyblock_core/cluster_ops.py index fbe91a58f..ff07e6634 100644 --- a/simplyblock_core/cluster_ops.py +++ b/simplyblock_core/cluster_ops.py @@ -1174,9 +1174,13 @@ def update_cluster(cluster_id, mgmt_only=False, restart=False, spdk_image=None, for service in cluster_docker.services.list(): if image_parts in service.attrs['Spec']['Labels']['com.docker.stack.image'] or \ "simplyblock" in service.attrs['Spec']['Labels']['com.docker.stack.image']: - logger.info(f"Updating service {service.name}") - service.update(image=service_image, force_update=True) - service_names.append(service.attrs['Spec']['Name']) + if service.name == "app_CachingNodeMonitor": + logger.info(f"Removing service {service.name}") + service.remove() + else: + logger.info(f"Updating service {service.name}") + service.update(image=service_image, force_update=True) + service_names.append(service.attrs['Spec']['Name']) if "app_SnapshotMonitor" not in service_names: logger.info("Creating snapshot monitor service") diff --git a/simplyblock_core/models/cluster.py b/simplyblock_core/models/cluster.py index fd4802771..620309f77 100644 --- a/simplyblock_core/models/cluster.py +++ b/simplyblock_core/models/cluster.py @@ -45,7 +45,7 @@ class Cluster(BaseModel): distr_npcs: int = 0 enable_node_affinity: bool = False grafana_endpoint: str = "" - mode: str = "" + mode: str = "docker" grafana_secret: str = "" contact_point: str = "" ha_type: str = "single" From 4a6a4d70dc771fc502fdd94b501c93b1bfaba75f Mon Sep 17 00:00:00 2001 From: Geoffrey Israel Date: Tue, 11 Nov 2025 09:24:24 +0100 Subject: [PATCH 5/6] Update Dockerfile_base (#730) * Update Dockerfile_base * Update Dockerfile_base --- docker/Dockerfile_base | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/Dockerfile_base b/docker/Dockerfile_base index 226188c96..201d92759 100644 --- a/docker/Dockerfile_base +++ b/docker/Dockerfile_base @@ -38,3 +38,5 @@ RUN pip3 install setuptools --upgrade COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt + +RUN rm -rf /usr/share/terminfo/ From 894730597db92a9a7d720a4a53731b64080a4bf8 Mon Sep 17 00:00:00 2001 From: hamdykhader Date: Tue, 11 Nov 2025 12:53:20 +0300 Subject: [PATCH 6/6] Enable QOS classes to be created and applied when cluster is active --- simplyblock_core/cluster_ops.py | 8 ++++---- simplyblock_core/controllers/qos_controller.py | 17 ++++++++++++----- simplyblock_core/rpc_client.py | 2 +- simplyblock_core/storage_node_ops.py | 12 ++++++------ 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/simplyblock_core/cluster_ops.py b/simplyblock_core/cluster_ops.py index ff07e6634..fbc77ed92 100644 --- a/simplyblock_core/cluster_ops.py +++ b/simplyblock_core/cluster_ops.py @@ -637,11 +637,11 @@ def cluster_activate(cl_id, force=False, force_lvstore_create=False) -> None: if cluster.is_qos_set(): for node in db_controller.get_storage_nodes_by_cluster_id(cl_id): - if node.status == StorageNode.STATUS_ONLINE: - logger.info(f"Setting Alcemls QOS weights on node {node.get_id()}") - ret = node.rpc_client().alceml_set_qos_weights(qos_controller.get_qos_weights_list(cl_id)) + if node.status in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_DOWN]: + logger.info(f"Setting Disribs QOS weights on node {node.get_id()}") + ret = node.rpc_client().distrib_set_qos_weights(qos_controller.get_qos_weights_list(cl_id)) if not ret: - logger.error(f"Failed to set Alcemls QOS on node: {node.get_id()}") + logger.error(f"Failed to set Disribs QOS on node: {node.get_id()}") if not cluster.cluster_max_size: cluster = db_controller.get_cluster_by_id(cl_id) diff --git a/simplyblock_core/controllers/qos_controller.py b/simplyblock_core/controllers/qos_controller.py index f3948de94..7f6ca135e 100644 --- a/simplyblock_core/controllers/qos_controller.py +++ b/simplyblock_core/controllers/qos_controller.py @@ -7,6 +7,7 @@ from simplyblock_core.db_controller import DBController from simplyblock_core.models.cluster import Cluster from simplyblock_core.models.qos import QOSClass +from simplyblock_core.models.storage_node import StorageNode logger = logging.getLogger() db = DBController() @@ -34,11 +35,6 @@ def add_class(name: str, weight: int, cluster_id: str) -> bool: logger.error("cluster_id is required") return False - cluster = db.get_cluster_by_id(cluster_id) - if cluster.status != Cluster.STATUS_UNREADY: - logger.error(f"cluster must be in state UNREADY, current status is {cluster.status}") - return False - qos_classes = db.get_qos(cluster_id) if len(qos_classes) >= 7: logger.error("Can not add more than 6 qos classes") @@ -60,6 +56,17 @@ def add_class(name: str, weight: int, cluster_id: str) -> bool: qos_class.weight = weight qos_class.write_to_db() + cluster = db.get_cluster_by_id(cluster_id) + if cluster.status in [Cluster.STATUS_ACTIVE, Cluster.STATUS_READONLY, Cluster.STATUS_DEGRADED]: + logger.error(f"cluster status is {cluster.status}, applying qos") + weighs_list = get_qos_weights_list(cluster_id) + for node in db.get_storage_nodes_by_cluster_id(cluster_id): + if node.status in [StorageNode.STATUS_ONLINE, StorageNode.STATUS_DOWN]: + logger.info(f"Setting Disribs QOS weights on node {node.get_id()}") + ret = node.rpc_client().distrib_set_qos_weights(weighs_list) + if not ret: + logger.error(f"Failed to set Disribs QOS on node: {node.get_id()}") + return True diff --git a/simplyblock_core/rpc_client.py b/simplyblock_core/rpc_client.py index 66ef478f8..5b503b52b 100644 --- a/simplyblock_core/rpc_client.py +++ b/simplyblock_core/rpc_client.py @@ -1189,7 +1189,7 @@ def bdev_lvol_remove_from_group(self, group_id, lvol_name_list): } return self._request("bdev_lvol_remove_from_group", params) - def alceml_set_qos_weights(self, qos_weights): + def distrib_set_qos_weights(self, qos_weights): params = { "qos_weights": qos_weights, } diff --git a/simplyblock_core/storage_node_ops.py b/simplyblock_core/storage_node_ops.py index 3d32dd17a..9eb6d55a1 100644 --- a/simplyblock_core/storage_node_ops.py +++ b/simplyblock_core/storage_node_ops.py @@ -1259,10 +1259,10 @@ def add_node(cluster_id, node_addr, iface_name,data_nics_list, # set qos values if enabled if cluster.is_qos_set(): - logger.info("Setting Alcemls QOS weights") - ret = rpc_client.alceml_set_qos_weights(qos_controller.get_qos_weights_list(cluster_id)) + logger.info("Setting Disribs QOS weights") + ret = rpc_client.distrib_set_qos_weights(qos_controller.get_qos_weights_list(cluster_id)) if not ret: - logger.error("Failed to set Alcemls QOS") + logger.error("Failed to set Disribs QOS") return False logger.info("Connecting to remote devices") @@ -1869,10 +1869,10 @@ def restart_storage_node( # set qos values if enabled if cluster.is_qos_set(): - logger.info("Setting Alcemls QOS weights") - ret = rpc_client.alceml_set_qos_weights(qos_controller.get_qos_weights_list(snode.cluster_id)) + logger.info("Setting Disribs QOS weights") + ret = rpc_client.distrib_set_qos_weights(qos_controller.get_qos_weights_list(snode.cluster_id)) if not ret: - logger.error("Failed to set Alcemls QOS") + logger.error("Failed to set Disribs QOS") return False logger.info("Connecting to remote devices")