Skip to content

Commit 9d3a6da

Browse files
authored
Merge pull request #1019 from gbregman/devel
Do not append group name to subsys NQN twice
2 parents 6a85b4d + 940be9e commit 9d3a6da

File tree

4 files changed

+132
-43
lines changed

4 files changed

+132
-43
lines changed

.github/workflows/build-container.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ jobs:
139139
strategy:
140140
fail-fast: false
141141
matrix:
142-
test: ["cli", "cli_change_lb", "cli_change_keys", "cli_change_ns_visibility", "state", "multi_gateway", "server", "grpc", "omap_lock", "log_files", "nsid", "psk", "dhchap"]
142+
test: ["cli", "cli_change_lb", "cli_change_keys", "cli_change_ns_visibility", "state", "multi_gateway", "server", "grpc", "omap_lock", "log_files", "nsid", "psk", "dhchap", "subsys_grp_name_append"]
143143
runs-on: ubuntu-latest
144144
env:
145145
HUGEPAGES: 512 # for multi gateway test, approx 256 per gateway instance

control/grpc.py

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,9 +1174,7 @@ def create_subsystem_safe(self, request, context):
11741174
error_message=errmsg,
11751175
nqn=request.subsystem_nqn)
11761176

1177-
if not request.max_namespaces:
1178-
request.max_namespaces = self.max_namespaces_per_subsystem
1179-
else:
1177+
if request.max_namespaces:
11801178
if request.max_namespaces > self.max_namespaces:
11811179
self.logger.warning(f"The requested max number of namespaces for subsystem "
11821180
f"{request.subsystem_nqn} ({request.max_namespaces}) is "
@@ -1232,31 +1230,35 @@ def create_subsystem_safe(self, request, context):
12321230
error_message=errmsg,
12331231
nqn=request.subsystem_nqn)
12341232

1235-
if context:
1236-
if request.no_group_append or not self.gateway_group:
1237-
self.logger.info("Subsystem NQN will not be changed")
1238-
else:
1239-
group_name_to_use = self.gateway_group.replace(GatewayState.OMAP_KEY_DELIMITER,
1240-
"-")
1241-
request.subsystem_nqn += f".{group_name_to_use}"
1242-
self.logger.info(f"Subsystem NQN was changed to {request.subsystem_nqn}, "
1243-
f"adding the group name")
1244-
12451233
# Set client ID range according to group id assigned by the monitor
12461234
offset = self.group_id * CNTLID_RANGE_SIZE
12471235
min_cntlid = offset + 1
12481236
max_cntlid = offset + CNTLID_RANGE_SIZE
12491237

1250-
if not request.serial_number:
1251-
random.seed()
1252-
randser = random.randint(2, 99999999999999)
1253-
request.serial_number = f"Ceph{randser}"
1254-
self.logger.info(f"No serial number specified for {request.subsystem_nqn}, will "
1255-
f"use {request.serial_number}")
1256-
12571238
ret = False
12581239
omap_lock = self.omap_lock.get_omap_lock_to_use(context)
12591240
with omap_lock:
1241+
if not request.max_namespaces:
1242+
request.max_namespaces = self.max_namespaces_per_subsystem
1243+
1244+
if not request.serial_number:
1245+
random.seed()
1246+
randser = random.randint(2, 99999999999999)
1247+
request.serial_number = f"Ceph{randser}"
1248+
self.logger.info(f"No serial number specified for {request.subsystem_nqn}, will "
1249+
f"use {request.serial_number}")
1250+
1251+
if context:
1252+
1253+
if request.no_group_append or not self.gateway_group:
1254+
self.logger.info("Subsystem NQN will not be changed")
1255+
else:
1256+
group_name_to_use = self.gateway_group.replace(
1257+
GatewayState.OMAP_KEY_DELIMITER, "-")
1258+
request.subsystem_nqn += f".{group_name_to_use}"
1259+
request.no_group_append = True
1260+
self.logger.info(f"Subsystem NQN was changed to {request.subsystem_nqn}, "
1261+
f"adding the group name")
12601262
errmsg = ""
12611263
try:
12621264
subsys_using_serial = None
@@ -2274,7 +2276,7 @@ def list_namespaces(self, request, context=None):
22742276
"""List namespaces."""
22752277

22762278
peer_msg = self.get_peer_message(context)
2277-
if request.nsid is None or request.nsid == 0:
2279+
if not request.nsid:
22782280
if request.uuid:
22792281
nsid_msg = f"namespace with UUID {request.uuid}"
22802282
else:
@@ -2567,28 +2569,28 @@ def namespace_set_qos_limits_safe(self, request, context):
25672569
f"limits are set for namespace {request.nsid} on "
25682570
f"{request.subsystem_nqn}")
25692571

2570-
# Merge current limits with previous ones, if exist
2571-
if ns_qos_entry:
2572-
if not request.HasField("rw_ios_per_second") and ns_qos_entry.get(
2573-
"rw_ios_per_second") is not None:
2574-
request.rw_ios_per_second = int(ns_qos_entry["rw_ios_per_second"])
2575-
if not request.HasField("rw_mbytes_per_second") and ns_qos_entry.get(
2576-
"rw_mbytes_per_second") is not None:
2577-
request.rw_mbytes_per_second = int(ns_qos_entry["rw_mbytes_per_second"])
2578-
if not request.HasField("r_mbytes_per_second") and ns_qos_entry.get(
2579-
"r_mbytes_per_second") is not None:
2580-
request.r_mbytes_per_second = int(ns_qos_entry["r_mbytes_per_second"])
2581-
if not request.HasField("w_mbytes_per_second") and ns_qos_entry.get(
2582-
"w_mbytes_per_second") is not None:
2583-
request.w_mbytes_per_second = int(ns_qos_entry["w_mbytes_per_second"])
2584-
2585-
limits_to_set = self.get_qos_limits_string(request)
2586-
self.logger.debug(f"After merging current QOS limits with previous ones for "
2587-
f"namespace {request.nsid} on {request.subsystem_nqn},"
2588-
f"{limits_to_set}")
2589-
25902572
omap_lock = self.omap_lock.get_omap_lock_to_use(context)
25912573
with omap_lock:
2574+
# Merge current limits with previous ones, if exist
2575+
if ns_qos_entry:
2576+
assert context, "Shouldn't get here on an update"
2577+
if not request.HasField("rw_ios_per_second") and ns_qos_entry.get(
2578+
"rw_ios_per_second") is not None:
2579+
request.rw_ios_per_second = int(ns_qos_entry["rw_ios_per_second"])
2580+
if not request.HasField("rw_mbytes_per_second") and ns_qos_entry.get(
2581+
"rw_mbytes_per_second") is not None:
2582+
request.rw_mbytes_per_second = int(ns_qos_entry["rw_mbytes_per_second"])
2583+
if not request.HasField("r_mbytes_per_second") and ns_qos_entry.get(
2584+
"r_mbytes_per_second") is not None:
2585+
request.r_mbytes_per_second = int(ns_qos_entry["r_mbytes_per_second"])
2586+
if not request.HasField("w_mbytes_per_second") and ns_qos_entry.get(
2587+
"w_mbytes_per_second") is not None:
2588+
request.w_mbytes_per_second = int(ns_qos_entry["w_mbytes_per_second"])
2589+
2590+
limits_to_set = self.get_qos_limits_string(request)
2591+
self.logger.debug(f"After merging current QOS limits with previous ones for "
2592+
f"namespace {request.nsid} on {request.subsystem_nqn},"
2593+
f"{limits_to_set}")
25922594
try:
25932595
ret = rpc_bdev.bdev_set_qos_limit(
25942596
self.spdk_rpc_client,

control/state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ def update(self) -> bool:
10481048
local_version = self.omap.get_local_version()
10491049

10501050
self.logger.info(f"Check local version {local_version} against OMAP version "
1051-
f"{omap_version}")
1051+
f"{omap_version} ({self.id_text}).")
10521052
if local_version < omap_version:
10531053
self.logger.info(f"Start update from {local_version} to {omap_version} "
10541054
f"({self.id_text}).")

tests/test_subsys_grp_name_append.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import pytest
2+
from control.server import GatewayServer
3+
from control.cli import main as cli
4+
from control.cephutils import CephUtils
5+
import grpc
6+
from control.proto import gateway_pb2_grpc as pb2_grpc
7+
import copy
8+
9+
image = "mytestdevimage"
10+
pool = "rbd"
11+
subsystem_prefix = "nqn.2016-06.io.spdk:cnode"
12+
config = "ceph-nvmeof.conf"
13+
group_name = "group1"
14+
15+
16+
@pytest.fixture(scope="module")
17+
def two_gateways(config):
18+
"""Sets up and tears down two Gateways"""
19+
nameA = "GatewayAA"
20+
nameB = "GatewayBB"
21+
sockA = f"spdk_{nameA}.sock"
22+
sockB = f"spdk_{nameB}.sock"
23+
config.config["gateway-logs"]["log_level"] = "debug"
24+
config.config["gateway"]["group"] = group_name
25+
config.config["gateway"]["rebalance_period_sec"] = "0"
26+
config.config["gateway"]["state_update_interval_sec"] = "360"
27+
config.config["gateway"]["state_update_notify"] = "False"
28+
addr = config.get("gateway", "addr")
29+
configA = copy.deepcopy(config)
30+
configB = copy.deepcopy(config)
31+
configA.config["gateway"]["name"] = nameA
32+
configA.config["gateway"]["override_hostname"] = nameA
33+
configA.config["spdk"]["rpc_socket_name"] = sockA
34+
configA.config["spdk"]["tgt_cmd_extra_args"] = "-m 0x03"
35+
portA = configA.getint("gateway", "port")
36+
configB.config["gateway"]["name"] = nameB
37+
configB.config["gateway"]["override_hostname"] = nameB
38+
configB.config["spdk"]["rpc_socket_name"] = sockB
39+
portB = portA + 2
40+
discPortB = configB.getint("discovery", "port") + 1
41+
configB.config["gateway"]["port"] = str(portB)
42+
configB.config["discovery"]["port"] = str(discPortB)
43+
configB.config["spdk"]["tgt_cmd_extra_args"] = "-m 0x0C"
44+
45+
ceph_utils = CephUtils(config)
46+
with (GatewayServer(configA) as gatewayA, GatewayServer(configB) as gatewayB):
47+
ceph_utils.execute_ceph_monitor_command(
48+
"{" + f'"prefix":"nvme-gw create", "id": "{nameA}", "pool": "{pool}", '
49+
f'"group": "{group_name}"' + "}"
50+
)
51+
ceph_utils.execute_ceph_monitor_command(
52+
"{" + f'"prefix":"nvme-gw create", "id": "{nameB}", "pool": "{pool}", '
53+
f'"group": "{group_name}"' + "}"
54+
)
55+
gatewayA.serve()
56+
gatewayB.serve()
57+
58+
channelA = grpc.insecure_channel(f"{addr}:{portA}")
59+
stubA = pb2_grpc.GatewayStub(channelA)
60+
channelB = grpc.insecure_channel(f"{addr}:{portB}")
61+
stubB = pb2_grpc.GatewayStub(channelB)
62+
63+
yield gatewayA, stubA, gatewayB, stubB
64+
gatewayA.gateway_rpc.gateway_state.delete_state()
65+
gatewayB.gateway_rpc.gateway_state.delete_state()
66+
gatewayA.server.stop(grace=1)
67+
gatewayB.server.stop(grace=1)
68+
69+
70+
def test_create_subsystems(caplog, two_gateways):
71+
gatewayA, stubA, gatewayB, stubB = two_gateways
72+
for i in range(20):
73+
caplog.clear()
74+
subsystem = f"{subsystem_prefix}{i}"
75+
cli(["subsystem", "add", "--subsystem", subsystem])
76+
subsystem += f".{group_name}"
77+
assert f"Adding subsystem {subsystem}: Successful" in caplog.text
78+
caplog.clear()
79+
subsystem = f"{subsystem_prefix}X"
80+
cli(["--server-port", "5502", "subsystem", "add", "--subsystem", subsystem])
81+
subsystem += f".{group_name}"
82+
assert "differs from OMAP file version" in caplog.text
83+
assert "The file is not current, will reload it and try again" in caplog.text
84+
assert f"Adding subsystem {subsystem}: Successful" in caplog.text
85+
caplog.clear()
86+
cli(["--format", "json", "subsystem", "list"])
87+
assert f".{group_name}.{{group_name}}" not in caplog.text

0 commit comments

Comments
 (0)