]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/nfs: When cluster level qos is disabled and export still has qos parameters,...
authorShweta Bhosale <Shweta.Bhosale1@ibm.com>
Wed, 19 Mar 2025 11:16:10 +0000 (16:46 +0530)
committerShweta Bhosale <Shweta.Bhosale1@ibm.com>
Mon, 27 Apr 2026 12:49:14 +0000 (18:19 +0530)
fixes: https://tracker.ceph.com/issues/69458
Signed-off-by: Shweta Bhosale <Shweta.Bhosale1@ibm.com>
src/pybind/mgr/nfs/export.py
src/pybind/mgr/nfs/export_utils.py

index 5961eba06f524917c1bb0c0690978a1b49f77fec..d0a15b85bf631e78512e8ce52be8459ca07fa1ad 100644 (file)
@@ -864,7 +864,11 @@ class ExportMgr:
 
         # check QOS
         if new_export_dict.get('qos_block'):
-            export_dict_qos_bw_ops_checks(cluster_id, self.mgr, dict(new_export_dict.get('qos_block', {})))
+            old_qos = {}
+            if old_export.qos_block:
+                old_qos = old_export.qos_block.to_dict()
+            export_dict_qos_bw_ops_checks(cluster_id, self.mgr, dict(new_export_dict.get('qos_block', {})),
+                                          old_qos)
 
         self.exports[cluster_id].remove(old_export)
 
index b5c31b5e931ab170b06c40600f4ab666d0a3210e..c67fd2fd5ec70cb55e17746ec7ad99e88f9ae059 100644 (file)
@@ -63,15 +63,39 @@ def export_dict_ops_checks(cluster_id: str,
 
 def export_dict_qos_bw_ops_checks(cluster_id: str,
                                   mgr_obj: Any,
-                                  qos_dict: dict) -> None:
+                                  qos_dict: dict,
+                                  old_qos_block: dict = {}) -> None:
     """Validate the qos block of dict passed to apply_export method"""
     qos_enable = qos_dict.get('enable_qos')
     if qos_enable is None:
         raise Exception('The QOS block requires at least the enable_qos parameter')
     if not isinstance(qos_enable, bool):
         raise Exception('Invalid value for the enable_qos parameter')
-    export_dict_bw_checks(cluster_id, mgr_obj, qos_enable, qos_dict)
-    export_dict_ops_checks(cluster_id, mgr_obj, qos_enable, qos_dict)
+    # if cluster level bandwidth or ops control is disabled or qos type changed to PerClient
+    # but old qos block still has those values we should accept it in apply command
+    validate_bw = True
+    validate_ops = True
+    clust_qos_obj = get_cluster_qos_config(cluster_id, mgr_obj)
+    if clust_qos_obj:
+        if not clust_qos_obj.enable_qos or clust_qos_obj.qos_type == QOSType.PerClient:
+            if old_qos_block == qos_dict:
+                return
+        if clust_qos_obj.enable_qos and clust_qos_obj.bw_obj and not clust_qos_obj.bw_obj.enable_bw_ctrl:
+            keys = [QOSParams.export_writebw.value, QOSParams.export_readbw.value,
+                    QOSParams.client_writebw.value, QOSParams.client_readbw.value,
+                    QOSParams.export_rw_bw.value, QOSParams.client_rw_bw.value,
+                    QOSParams.enable_bw_ctrl.value, QOSParams.combined_bw_ctrl.value]
+            if all(old_qos_block.get(key) == qos_dict.get(key) for key in keys):
+                validate_bw = False
+        if clust_qos_obj.enable_qos and clust_qos_obj.ops_obj and not clust_qos_obj.ops_obj.enable_iops_ctrl:
+            keys = [QOSParams.max_export_iops.value, QOSParams.max_client_iops.value,
+                    QOSParams.enable_iops_ctrl.value]
+            if all(old_qos_block.get(key) == qos_dict.get(key) for key in keys):
+                validate_ops = False
+    if validate_bw:
+        export_dict_bw_checks(cluster_id, mgr_obj, qos_enable, qos_dict)
+    if validate_ops:
+        export_dict_ops_checks(cluster_id, mgr_obj, qos_enable, qos_dict)
 
 
 def export_qos_bw_checks(cluster_id: str,