Skip to content

Commit 2cb61b3

Browse files
Alexander Indenbaumadk3798
andcommitted
NvmeofServiceSpec: ceph connection allocation strategies
Co-authored-by: Adam King <[email protected]> Signed-off-by: Alexander Indenbaum <[email protected]>
1 parent bb4d512 commit 2cb61b3

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

src/pybind/mgr/cephadm/templates/services/nvmeof/ceph-nvmeof.conf.j2

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,15 @@ tgt_path = {{ spec.tgt_path }}
6666
rpc_socket_dir = {{ spec.rpc_socket_dir }}
6767
rpc_socket_name = {{ spec.rpc_socket_name }}
6868
timeout = {{ spec.spdk_timeout }}
69+
{% if spec.bdevs_per_cluster %}
6970
bdevs_per_cluster = {{ spec.bdevs_per_cluster }}
71+
{% endif %}
72+
{% if spec.flat_bdevs_per_cluster %}
73+
flat_bdevs_per_cluster = {{ spec.flat_bdevs_per_cluster }}
74+
{% endif %}
75+
{% if spec.cluster_connections %}
76+
cluster_connections = {{ spec.cluster_connections }}
77+
{% endif %}
7078
{% if spec.spdk_log_level %}
7179
log_level = {{ spec.spdk_log_level }}
7280
{% endif %}

src/pybind/mgr/cephadm/tests/test_services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ def test_nvmeof_config(self, _get_name, _run_cephadm, cephadm_module: CephadmOrc
415415
rpc_socket_dir = /var/tmp/
416416
rpc_socket_name = spdk.sock
417417
timeout = 60.0
418-
bdevs_per_cluster = 32
418+
cluster_connections = 32
419419
protocol_log_level = WARNING
420420
conn_retries = 10
421421
transports = tcp

src/python-common/ceph/deployment/service_spec.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,7 +1369,9 @@ def __init__(self,
13691369
enable_prometheus_exporter: Optional[bool] = True,
13701370
prometheus_port: Optional[int] = 10008,
13711371
prometheus_stats_interval: Optional[int] = 10,
1372-
bdevs_per_cluster: Optional[int] = 32,
1372+
bdevs_per_cluster: Optional[int] = None,
1373+
flat_bdevs_per_cluster: Optional[int] = None,
1374+
cluster_connections: Optional[int] = None,
13731375
verify_nqns: Optional[bool] = True,
13741376
verify_keys: Optional[bool] = True,
13751377
verify_listener_ip: Optional[bool] = True,
@@ -1505,8 +1507,22 @@ def __init__(self,
15051507
self.spdk_ping_interval_in_seconds = spdk_ping_interval_in_seconds
15061508
#: ``ping_spdk_under_lock`` whether or not we should perform SPDK ping under the RPC lock
15071509
self.ping_spdk_under_lock = ping_spdk_under_lock
1510+
# spdk to ceph connection mapping
1511+
#: see
1512+
#: https://github.com/ceph/ceph-nvmeof?tab=readme-ov-file#mapping-spdk-bdevs-into-a-ceph-rados-cluster-context # noqa: E501
15081513
#: ``bdevs_per_cluster`` number of bdevs per cluster
15091514
self.bdevs_per_cluster = bdevs_per_cluster
1515+
#: ``flat_bdevs_per_cluster`` number of bdevs per cluster, ignore ANA group
1516+
self.flat_bdevs_per_cluster = flat_bdevs_per_cluster
1517+
#: ``cluster_connections`` number of ceph cluster connections
1518+
self.cluster_connections = cluster_connections
1519+
# set default only if all spdk alloc stratgies are None (no parameters explicitly defined)
1520+
if all([
1521+
self.bdevs_per_cluster is None,
1522+
self.flat_bdevs_per_cluster is None,
1523+
self.cluster_connections is None
1524+
]):
1525+
self.cluster_connections = 32
15101526
#: ``server_key`` gateway server key
15111527
self.server_key = server_key
15121528
#: ``server_cert`` gateway server certificate
@@ -1579,6 +1595,37 @@ def __init__(self,
15791595
def get_port_start(self) -> List[int]:
15801596
return [self.port, 4420, self.discovery_port, self.prometheus_port]
15811597

1598+
def verify_spdk_ceph_connection_allocation(self) -> None:
1599+
"""
1600+
Validate that exactly one of bdevs_per_cluster, flat_bdevs_per_cluster, or
1601+
cluster_connections is defined (not None), and that the defined parameter
1602+
is a positive integer.
1603+
1604+
Raises:
1605+
SpecValidationError: If zero or more than one parameter is defined,
1606+
or if the defined parameter is not a positive integer.
1607+
"""
1608+
defined_vars = [
1609+
('bdevs_per_cluster', self.bdevs_per_cluster),
1610+
('flat_bdevs_per_cluster', self.flat_bdevs_per_cluster),
1611+
('cluster_connections', self.cluster_connections)
1612+
]
1613+
1614+
defined_count = sum(1 for _, value in defined_vars if value is not None)
1615+
1616+
if defined_count != 1:
1617+
raise SpecValidationError(
1618+
"Exactly one of 'bdevs_per_cluster', 'flat_bdevs_per_cluster', or "
1619+
"'cluster_connections' must be defined (not None); others must be None. "
1620+
f"Found {defined_count} defined parameters."
1621+
)
1622+
1623+
# validate the defined parameter
1624+
for name, value in defined_vars:
1625+
if value is not None:
1626+
verify_positive_int(value, name)
1627+
break # only one should be defined, so we can stop after validating it
1628+
15821629
def validate(self) -> None:
15831630
# TODO: what other parameters should be validated as part of this function?
15841631
super(NvmeofServiceSpec, self).validate()
@@ -1606,9 +1653,7 @@ def validate(self) -> None:
16061653
['DEBUG', 'INFO', 'WARNING', 'ERROR', 'NOTICE'])
16071654
verify_enum(self.spdk_protocol_log_level, "SPDK protocol log level",
16081655
['DEBUG', 'INFO', 'WARNING', 'ERROR', 'NOTICE'])
1609-
verify_positive_int(self.bdevs_per_cluster, "Bdevs per cluster")
1610-
if self.bdevs_per_cluster is not None and self.bdevs_per_cluster < 1:
1611-
raise SpecValidationError("Bdevs per cluster should be at least 1")
1656+
self.verify_spdk_ceph_connection_allocation()
16121657
verify_non_negative_int(self.qos_timeslice_in_usecs, "QOS timeslice")
16131658

16141659
verify_non_negative_number(self.spdk_ping_interval_in_seconds, "SPDK ping interval")

0 commit comments

Comments
 (0)