Skip to content

Commit 51e7d20

Browse files
authored
DAOS-17935 control: Remove spdk lockfiles before and after local scan (#16769)
Remove SPDK device lockfiles before and after ControlService performs a scan on engine-assigned bdevs when an engine is not running. This removes SPDK lockfiles for a device only when the engine has not claimed that device. Signed-off-by: Tom Nabarro <thomas.nabarro@hpe.com>
1 parent 1e4e902 commit 51e7d20

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

‎src/control/server/storage/bdev/backend.go‎

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ func spdkLockfileAddrCheckAllowAll(_ string) (bool, error) {
232232
// Skip addresses in block list if present then supply address check function that can detect VMD
233233
// backing device addresses during clean operation. If CleanSpdkLockfilesAny set, all lockfiles
234234
// should be removed.
235-
func (sb *spdkBackend) removeSpdkLockfiles(req storage.BdevPrepareRequest, resp *storage.BdevPrepareResponse) error {
235+
func (sb *spdkBackend) cleanLockfiles(req storage.BdevPrepareRequest, resp *storage.BdevPrepareResponse) error {
236236
var lfAddrCheckFn spdk.LockfileAddrCheckFn
237237

238238
if req.CleanSpdkLockfilesAny {
@@ -303,7 +303,7 @@ func (sb *spdkBackend) prepare(req storage.BdevPrepareRequest, vmdDetect vmdDete
303303
}
304304
}
305305
if req.CleanSpdkLockfiles {
306-
if err := sb.removeSpdkLockfiles(req, resp); err != nil {
306+
if err := sb.cleanLockfiles(req, resp); err != nil {
307307
return resp, errors.Wrapf(err, "clean spdk lockfiles")
308308
}
309309
}
@@ -419,14 +419,37 @@ func groomDiscoveredBdevs(reqDevs *hardware.PCIAddressSet, discovered storage.Nv
419419
return out, nil
420420
}
421421

422+
func (sb *spdkBackend) cleanLockfilesQuiet(devAddrs *hardware.PCIAddressSet) {
423+
msg := fmt.Sprintf("spdk backend clean-locks (bindings discover call): for %v",
424+
devAddrs.Strings())
425+
addrCheckFn := createSpdkLockfileAddrCheckFunc(devAddrs)
426+
427+
removed, err := sb.binding.Clean(sb.log, addrCheckFn)
428+
if err != nil {
429+
sb.log.Errorf("%s: %s", msg, err.Error())
430+
return
431+
}
432+
sb.log.Debugf("%s: removed %v", msg, removed)
433+
}
434+
422435
// Scan discovers NVMe controllers accessible by SPDK.
423436
func (sb *spdkBackend) Scan(req storage.BdevScanRequest) (*storage.BdevScanResponse, error) {
437+
needDevs := req.DeviceList.PCIAddressSetPtr()
438+
439+
// Remove SPDK lockfiles for requested addresses before and after scan, requested addresses
440+
// should not be in use by other processes and SPDK will refuse access if they are.
441+
if needDevs.IsEmpty() {
442+
sb.log.Debug("clean spdk lockfiles skipped, zero devices selected")
443+
} else {
444+
sb.cleanLockfilesQuiet(needDevs)
445+
defer sb.cleanLockfilesQuiet(needDevs)
446+
}
447+
424448
sb.log.Debugf("spdk backend scan (bindings discover call): %+v", req)
425449

426450
// Only filter devices if all have a PCI address, avoid validating the presence of emulated
427451
// NVMe devices as they may not exist yet e.g. for SPDK AIO-file the devices are created on
428452
// format.
429-
needDevs := req.DeviceList.PCIAddressSetPtr()
430453
spdkOpts := &spdk.EnvOptions{
431454
PCIAllowList: needDevs,
432455
EnableVMD: req.VMDEnabled,

0 commit comments

Comments
 (0)