sma: support bdev-based QoS for NVMe/TCP devices
Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com> Change-Id: I9634c2492addd3b4848d4b53b9b258dd59b7d1dd Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14269 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
aed37fb98f
commit
89b81dc2ff
@ -2,6 +2,7 @@ import grpc
|
|||||||
import logging
|
import logging
|
||||||
import uuid
|
import uuid
|
||||||
from spdk.rpc.client import JSONRPCException
|
from spdk.rpc.client import JSONRPCException
|
||||||
|
from spdk.sma import qos
|
||||||
from .device import DeviceManager, DeviceException
|
from .device import DeviceManager, DeviceException
|
||||||
from ..common import format_volume_id, volume_id_to_nguid
|
from ..common import format_volume_id, volume_id_to_nguid
|
||||||
from ..volume import get_crypto_engine, CryptoException
|
from ..volume import get_crypto_engine, CryptoException
|
||||||
@ -209,3 +210,37 @@ class NvmfTcpDeviceManager(DeviceManager):
|
|||||||
|
|
||||||
def owns_device(self, handle):
|
def owns_device(self, handle):
|
||||||
return handle.startswith('nvmf-tcp')
|
return handle.startswith('nvmf-tcp')
|
||||||
|
|
||||||
|
def set_qos(self, request):
|
||||||
|
nqn = self._get_nqn_from_handle(request.device_handle)
|
||||||
|
volume = format_volume_id(request.volume_id)
|
||||||
|
if volume is None:
|
||||||
|
raise DeviceException(grpc.StatusCode.INVALID_ARGUMENT,
|
||||||
|
'Invalid volume ID')
|
||||||
|
try:
|
||||||
|
with self._client() as client:
|
||||||
|
# Make sure that a volume exists and is attached to the device
|
||||||
|
bdev = self._find_bdev(client, volume)
|
||||||
|
if bdev is None:
|
||||||
|
raise DeviceException(grpc.StatusCode.NOT_FOUND,
|
||||||
|
'No volume associated with volume_id could be found')
|
||||||
|
try:
|
||||||
|
subsys = client.call('nvmf_get_subsystems', {'nqn': nqn})[0]
|
||||||
|
except JSONRPCException:
|
||||||
|
raise DeviceException(grpc.StatusCode.NOT_FOUND,
|
||||||
|
'No device associated with device_handle could be found')
|
||||||
|
for ns in subsys['namespaces']:
|
||||||
|
if ns['name'] == bdev['name']:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise DeviceException(grpc.StatusCode.INVALID_ARGUMENT,
|
||||||
|
'Specified volume is not attached to the device')
|
||||||
|
qos.set_volume_bdev_qos(client, request)
|
||||||
|
except qos.QosException as ex:
|
||||||
|
raise DeviceException(ex.code, ex.message)
|
||||||
|
except JSONRPCException:
|
||||||
|
raise DeviceException(grpc.StatusCode.INTERNAL,
|
||||||
|
'Failed to set QoS')
|
||||||
|
|
||||||
|
def get_qos_capabilities(self, request):
|
||||||
|
return qos.get_bdev_qos_capabilities()
|
||||||
|
Loading…
Reference in New Issue
Block a user