Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DAOS-14793 control: Fail if VMD has no backing storage (#13503) #13546

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/control/server/server_utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -858,9 +858,9 @@ func TestServer_scanBdevStorage(t *testing.T) {
},
"bdev in config not found by spdk": {
bmbc: &bdev.MockBackendConfig{
ScanErr: storage.FaultBdevNotFound(test.MockPCIAddr()),
ScanErr: storage.FaultBdevNotFound(false, test.MockPCIAddr()),
},
expErr: storage.FaultBdevNotFound(test.MockPCIAddr()),
expErr: storage.FaultBdevNotFound(false, test.MockPCIAddr()),
},
"successful scan": {
bmbc: &bdev.MockBackendConfig{
Expand Down
4 changes: 2 additions & 2 deletions src/control/server/storage/bdev/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ func (sb *spdkBackend) Prepare(req storage.BdevPrepareRequest) (*storage.BdevPre

// groomDiscoveredBdevs ensures that for a non-empty device list, restrict output controller data
// to only those devices discovered and in device list and confirm that the devices specified in
// the device list have all been discovered.
// the device list have all been discovered. VMD addresses with no backing devices return error.
func groomDiscoveredBdevs(reqDevs *hardware.PCIAddressSet, discovered storage.NvmeControllers, vmdEnabled bool) (storage.NvmeControllers, error) {
// if the request does not specify a device filter, return all discovered controllers
if reqDevs.IsEmpty() {
Expand Down Expand Up @@ -319,7 +319,7 @@ func groomDiscoveredBdevs(reqDevs *hardware.PCIAddressSet, discovered storage.Nv
}

if !missing.IsEmpty() {
return nil, storage.FaultBdevNotFound(missing.Strings()...)
return nil, storage.FaultBdevNotFound(vmdEnabled, missing.Strings()...)
}

return out, nil
Expand Down
14 changes: 11 additions & 3 deletions src/control/server/storage/bdev/backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,22 @@ func TestBackend_groomDiscoveredBdevs(t *testing.T) {
"missing": {
reqAddrList: []string{ctrlr1.PciAddr, ctrlr2.PciAddr, ctrlr3.PciAddr},
inCtrlrs: storage.NvmeControllers{ctrlr1, ctrlr3},
expErr: storage.FaultBdevNotFound(ctrlr2.PciAddr),
expErr: storage.FaultBdevNotFound(false, ctrlr2.PciAddr),
},
"vmd devices; vmd not enabled": {
reqAddrList: []string{"0000:85:05.5"},
inCtrlrs: ctrlrsFromPCIAddrs("850505:07:00.0", "850505:09:00.0",
"850505:0b:00.0", "850505:0d:00.0", "850505:0f:00.0",
"850505:11:00.0", "850505:14:00.0", "5d0505:03:00.0"),
expErr: storage.FaultBdevNotFound("0000:85:05.5"),
expErr: storage.FaultBdevNotFound(false, "0000:85:05.5"),
},
"vmd enabled; missing backing devices": {
vmdEnabled: true,
reqAddrList: []string{"0000:85:05.5", "0000:05:05.5"},
inCtrlrs: ctrlrsFromPCIAddrs("850505:07:00.0", "850505:09:00.0",
"850505:0b:00.0", "850505:0d:00.0", "850505:0f:00.0",
"850505:11:00.0", "850505:14:00.0", "5d0505:03:00.0"),
expErr: storage.FaultBdevNotFound(true, "0000:05:05.5"),
},
"vmd devices; vmd enabled": {
vmdEnabled: true,
Expand Down Expand Up @@ -205,7 +213,7 @@ func TestBackend_Scan(t *testing.T) {
DiscoverCtrlrs: storage.NvmeControllers{ctrlr1},
},
req: mockScanReq(storage.MockNvmeController(2).PciAddr),
expErr: storage.FaultBdevNotFound(storage.MockNvmeController(2).PciAddr),
expErr: storage.FaultBdevNotFound(false, storage.MockNvmeController(2).PciAddr),
},
"emulated nvme; AIO-file": {
req: mockScanReq(storage.MockNvmeAioFile(2).Path),
Expand Down
2 changes: 1 addition & 1 deletion src/control/server/storage/bdev/firmware.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ func getDeviceController(pciAddr string, controllers storage.NvmeControllers) (*
}
}

return nil, storage.FaultBdevNotFound(pciAddr)
return nil, storage.FaultBdevNotFound(false, pciAddr)
}

func filterControllersByModelFirmware(controllers storage.NvmeControllers, modelID, fwRev string) storage.NvmeControllers {
Expand Down
2 changes: 1 addition & 1 deletion src/control/server/storage/bdev/firmware_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ func TestProvider_UpdateFirmware(t *testing.T) {
backendCfg: &MockBackendConfig{
ScanRes: &storage.BdevScanResponse{Controllers: defaultDevs},
},
expErr: storage.FaultBdevNotFound("fake"),
expErr: storage.FaultBdevNotFound(false, "fake"),
},
"request duplicates": {
input: storage.NVMeFirmwareUpdateRequest{
Expand Down
16 changes: 10 additions & 6 deletions src/control/server/storage/faults.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,14 +189,18 @@ func FaultBdevConfigBadNrRoles(role string, gotNr, wantNr int) *fault.Fault {
role, wantNr))
}

// FaultBdevNotFound creates a Fault for the case where no NVMe storage devices
// match expected PCI addresses.
func FaultBdevNotFound(bdevs ...string) *fault.Fault {
// FaultBdevNotFound creates a Fault for the case where no NVMe storage devices match expected PCI
// addresses. VMD addresses are expected to have backing devices.
func FaultBdevNotFound(vmdEnabled bool, bdevs ...string) *fault.Fault {
msg := fmt.Sprintf("NVMe SSD%s", common.Pluralise("", len(bdevs)))
if vmdEnabled {
msg = "backing devices for VMDs"
}

return storageFault(
code.BdevNotFound,
fmt.Sprintf("NVMe SSD%s %v not found", common.Pluralise("", len(bdevs)), bdevs),
fmt.Sprintf("check SSD%s %v that are specified in server config exist",
common.Pluralise("", len(bdevs)), bdevs),
fmt.Sprintf("%s %v not found", msg, bdevs),
fmt.Sprintf("check %s %v that are specified in server config exist", msg, bdevs),
)
}

Expand Down