Skip to content

Commit d2ba72a

Browse files
committed
feat(backend): replace Nvme path map with gokv.Store abstraction
Signed-off-by: Boris Glimcher <Boris.Glimcher@emc.com>
1 parent f7de3a5 commit d2ba72a

File tree

3 files changed

+63
-41
lines changed

3 files changed

+63
-41
lines changed

pkg/backend/backend.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@ import (
1515
pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go"
1616
)
1717

18-
// TODO: can we combine all of volume types into a single list?
19-
// maybe create a volume abstraction like bdev in SPDK?
20-
21-
// VolumeParameters contains all BackEnd volume related structures
22-
type VolumeParameters struct {
23-
NvmePaths map[string]*pb.NvmePath
24-
}
25-
2618
// Server contains backend related OPI services
2719
type Server struct {
2820
pb.UnimplementedNvmeRemoteControllerServiceServer
@@ -31,7 +23,6 @@ type Server struct {
3123

3224
rpc spdk.JSONRPC
3325
store gokv.Store
34-
Volumes VolumeParameters
3526
Pagination map[string]int
3627
psk psk
3728
}
@@ -51,11 +42,8 @@ func NewServer(jsonRPC spdk.JSONRPC, store gokv.Store) *Server {
5142
log.Panic("nil for Store is not allowed")
5243
}
5344
return &Server{
54-
rpc: jsonRPC,
55-
store: store,
56-
Volumes: VolumeParameters{
57-
NvmePaths: make(map[string]*pb.NvmePath),
58-
},
45+
rpc: jsonRPC,
46+
store: store,
5947
Pagination: make(map[string]int),
6048
psk: psk{
6149
createTempFile: os.CreateTemp,

pkg/backend/nvme_path.go

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,19 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
4949
}
5050
in.NvmePath.Name = utils.ResourceIDToVolumeName(resourceID)
5151

52-
nvmePath, ok := s.Volumes.NvmePaths[in.NvmePath.Name]
53-
if ok {
52+
nvmePath := new(pb.NvmePath)
53+
found, err := s.store.Get(in.NvmePath.Name, nvmePath)
54+
if err != nil {
55+
fmt.Printf("Failed to interact with store: %v", err)
56+
return nil, err
57+
}
58+
if found {
5459
log.Printf("Already existing NvmePath with id %v", in.NvmePath.Name)
5560
return nvmePath, nil
5661
}
5762

5863
controller := new(pb.NvmeRemoteController)
59-
found, err := s.store.Get(in.NvmePath.ControllerNameRef, controller)
64+
found, err = s.store.Get(in.NvmePath.ControllerNameRef, controller)
6065
if err != nil {
6166
fmt.Printf("Failed to interact with store: %v", err)
6267
return nil, err
@@ -115,7 +120,10 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
115120
log.Printf("Received from SPDK: %v", result)
116121

117122
response := utils.ProtoClone(in.NvmePath)
118-
s.Volumes.NvmePaths[in.NvmePath.Name] = response
123+
err = s.store.Set(in.NvmePath.Name, response)
124+
if err != nil {
125+
return nil, err
126+
}
119127
log.Printf("CreateNvmePath: Sending to client: %v", response)
120128
return response, nil
121129
}
@@ -128,8 +136,13 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
128136
log.Printf("error: %v", err)
129137
return nil, err
130138
}
131-
nvmePath, ok := s.Volumes.NvmePaths[in.Name]
132-
if !ok {
139+
nvmePath := new(pb.NvmePath)
140+
found, err := s.store.Get(in.Name, nvmePath)
141+
if err != nil {
142+
fmt.Printf("Failed to interact with store: %v", err)
143+
return nil, err
144+
}
145+
if !found {
133146
if in.AllowMissing {
134147
return &emptypb.Empty{}, nil
135148
}
@@ -138,7 +151,7 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
138151
return nil, err
139152
}
140153
controller := new(pb.NvmeRemoteController)
141-
found, err := s.store.Get(nvmePath.ControllerNameRef, controller)
154+
found, err = s.store.Get(nvmePath.ControllerNameRef, controller)
142155
if err != nil {
143156
fmt.Printf("Failed to interact with store: %v", err)
144157
return nil, err
@@ -171,7 +184,10 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
171184
return nil, status.Errorf(codes.InvalidArgument, msg)
172185
}
173186

174-
delete(s.Volumes.NvmePaths, in.Name)
187+
err = s.store.Delete(nvmePath.Name)
188+
if err != nil {
189+
return nil, err
190+
}
175191

176192
return &emptypb.Empty{}, nil
177193
}
@@ -185,8 +201,13 @@ func (s *Server) UpdateNvmePath(_ context.Context, in *pb.UpdateNvmePathRequest)
185201
return nil, err
186202
}
187203
// fetch object from the database
188-
volume, ok := s.Volumes.NvmePaths[in.NvmePath.Name]
189-
if !ok {
204+
volume := new(pb.NvmePath)
205+
found, err := s.store.Get(in.NvmePath.Name, volume)
206+
if err != nil {
207+
fmt.Printf("Failed to interact with store: %v", err)
208+
return nil, err
209+
}
210+
if !found {
190211
if in.AllowMissing {
191212
log.Printf("TODO: in case of AllowMissing, create a new resource, don;t return error")
192213
}
@@ -202,7 +223,10 @@ func (s *Server) UpdateNvmePath(_ context.Context, in *pb.UpdateNvmePathRequest)
202223
}
203224
log.Printf("TODO: use resourceID=%v", resourceID)
204225
response := utils.ProtoClone(in.NvmePath)
205-
// s.Volumes.NvmePaths[in.NvmePath.Name] = response
226+
// err = s.store.Set(in.NvmePath.Name, response)
227+
// if err != nil {
228+
// return nil, err
229+
// }
206230
return response, nil
207231
}
208232

@@ -252,15 +276,20 @@ func (s *Server) GetNvmePath(_ context.Context, in *pb.GetNvmePathRequest) (*pb.
252276
return nil, err
253277
}
254278
// fetch object from the database
255-
path, ok := s.Volumes.NvmePaths[in.Name]
256-
if !ok {
279+
path := new(pb.NvmePath)
280+
found, err := s.store.Get(in.Name, path)
281+
if err != nil {
282+
fmt.Printf("Failed to interact with store: %v", err)
283+
return nil, err
284+
}
285+
if !found {
257286
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
258287
log.Printf("error: %v", err)
259288
return nil, err
260289
}
261290

262291
var result []spdk.BdevNvmeGetControllerResult
263-
err := s.rpc.Call("bdev_nvme_get_controllers", nil, &result)
292+
err = s.rpc.Call("bdev_nvme_get_controllers", nil, &result)
264293
if err != nil {
265294
log.Printf("error: %v", err)
266295
return nil, err
@@ -287,16 +316,21 @@ func (s *Server) StatsNvmePath(_ context.Context, in *pb.StatsNvmePathRequest) (
287316
return nil, err
288317
}
289318
// fetch object from the database
290-
volume, ok := s.Volumes.NvmePaths[in.Name]
291-
if !ok {
319+
volume := new(pb.NvmePath)
320+
found, err := s.store.Get(in.Name, volume)
321+
if err != nil {
322+
fmt.Printf("Failed to interact with store: %v", err)
323+
return nil, err
324+
}
325+
if !found {
292326
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
293327
log.Printf("error: %v", err)
294328
return nil, err
295329
}
296330
resourceID := path.Base(volume.Name)
297331
log.Printf("TODO: send name to SPDK and get back stats: %v", resourceID)
298332
var result spdk.NvmfGetSubsystemStatsResult
299-
err := s.rpc.Call("nvmf_get_stats", nil, &result)
333+
err = s.rpc.Call("nvmf_get_stats", nil, &result)
300334
if err != nil {
301335
log.Printf("error: %v", err)
302336
return nil, err
@@ -325,11 +359,11 @@ func (s *Server) opiMultipathToSpdk(multipath pb.NvmeMultipath) string {
325359

326360
func (s *Server) numberOfPathsForController(controllerName string) int {
327361
numberOfPaths := 0
328-
for _, path := range s.Volumes.NvmePaths {
329-
if path.ControllerNameRef == controllerName {
330-
numberOfPaths++
331-
}
332-
}
362+
// for _, path := range s.Volumes.NvmePaths {
363+
// if path.ControllerNameRef == controllerName {
364+
// numberOfPaths++
365+
// }
366+
// }
333367
return numberOfPaths
334368
}
335369

pkg/backend/nvme_path_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ func TestBackEnd_CreateNvmePath(t *testing.T) {
232232
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, utils.ProtoClone(tt.controller))
233233

234234
if tt.exist {
235-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = utils.ProtoClone(&testNvmePathWithName)
235+
testEnv.opiSpdkServer.store.Set(testNvmePathName, &testNvmePathWithName)
236236
}
237237
if tt.out != nil {
238238
tt.out = utils.ProtoClone(tt.out)
@@ -451,7 +451,7 @@ func TestBackEnd_DeleteNvmePath(t *testing.T) {
451451
testEnv := createTestEnvironment(tt.spdk)
452452
defer testEnv.Close()
453453

454-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = utils.ProtoClone(&testNvmePathWithName)
454+
testEnv.opiSpdkServer.store.Set(testNvmePathName, &testNvmePathWithName)
455455
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, &testNvmeCtrlWithName)
456456

457457
request := &pb.DeleteNvmePathRequest{Name: tt.in, AllowMissing: tt.missing}
@@ -637,7 +637,7 @@ func TestBackEnd_UpdateNvmePath(t *testing.T) {
637637
testEnv := createTestEnvironment(tt.spdk)
638638
defer testEnv.Close()
639639

640-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = utils.ProtoClone(&testNvmePathWithName)
640+
testEnv.opiSpdkServer.store.Set(testNvmePathName, &testNvmePathWithName)
641641

642642
request := &pb.UpdateNvmePathRequest{NvmePath: tt.in, UpdateMask: tt.mask, AllowMissing: tt.missing}
643643
response, err := testEnv.client.UpdateNvmePath(testEnv.ctx, request)
@@ -950,7 +950,7 @@ func TestBackEnd_GetNvmePath(t *testing.T) {
950950
testEnv := createTestEnvironment(tt.spdk)
951951
defer testEnv.Close()
952952

953-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = utils.ProtoClone(&testNvmePathWithName)
953+
testEnv.opiSpdkServer.store.Set(testNvmePathID, &testNvmePathWithName)
954954

955955
request := &pb.GetNvmePathRequest{Name: tt.in}
956956
response, err := testEnv.client.GetNvmePath(testEnv.ctx, request)
@@ -1053,7 +1053,7 @@ func TestBackEnd_StatsNvmePath(t *testing.T) {
10531053
testEnv := createTestEnvironment(tt.spdk)
10541054
defer testEnv.Close()
10551055

1056-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = utils.ProtoClone(&testNvmePathWithName)
1056+
testEnv.opiSpdkServer.store.Set(testNvmePathID, &testNvmePathWithName)
10571057

10581058
request := &pb.StatsNvmePathRequest{Name: tt.in}
10591059
response, err := testEnv.client.StatsNvmePath(testEnv.ctx, request)

0 commit comments

Comments
 (0)