Skip to content

Commit

Permalink
feat(backend): replace Null map with gokv.Store abstraction
Browse files Browse the repository at this point in the history
Signed-off-by: Boris Glimcher <Boris.Glimcher@emc.com>
  • Loading branch information
glimchb committed Sep 27, 2023
1 parent 0936d3e commit bdd41a0
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 29 deletions.
3 changes: 0 additions & 3 deletions pkg/backend/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ import (

// VolumeParameters contains all BackEnd volume related structures
type VolumeParameters struct {
NullVolumes map[string]*pb.NullVolume

NvmeControllers map[string]*pb.NvmeRemoteController
NvmePaths map[string]*pb.NvmePath
}
Expand Down Expand Up @@ -57,7 +55,6 @@ func NewServer(jsonRPC spdk.JSONRPC, store gokv.Store) *Server {
rpc: jsonRPC,
store: store,
Volumes: VolumeParameters{
NullVolumes: make(map[string]*pb.NullVolume),
NvmeControllers: make(map[string]*pb.NvmeRemoteController),
NvmePaths: make(map[string]*pb.NvmePath),
},
Expand Down
61 changes: 43 additions & 18 deletions pkg/backend/null.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,13 @@ func (s *Server) CreateNullVolume(_ context.Context, in *pb.CreateNullVolumeRequ
}
in.NullVolume.Name = server.ResourceIDToVolumeName(resourceID)
// idempotent API when called with same key, should return same object
volume, ok := s.Volumes.NullVolumes[in.NullVolume.Name]
if ok {
volume := new(pb.NullVolume)
found, err := s.store.Get(in.NullVolume.Name, volume)
if err != nil {
fmt.Printf("Failed to interact with store: %v", err)
return nil, err
}

Check warning on line 56 in pkg/backend/null.go

View check run for this annotation

Codecov / codecov/patch

pkg/backend/null.go#L54-L56

Added lines #L54 - L56 were not covered by tests
if found {
log.Printf("Already existing NullVolume with id %v", in.NullVolume.Name)
return volume, nil
}
Expand All @@ -60,7 +65,7 @@ func (s *Server) CreateNullVolume(_ context.Context, in *pb.CreateNullVolumeRequ
NumBlocks: 64,
}
var result spdk.BdevNullCreateResult
err := s.rpc.Call("bdev_null_create", &params, &result)
err = s.rpc.Call("bdev_null_create", &params, &result)
if err != nil {
log.Printf("error: %v", err)
return nil, err
Expand All @@ -72,7 +77,10 @@ func (s *Server) CreateNullVolume(_ context.Context, in *pb.CreateNullVolumeRequ
return nil, status.Errorf(codes.InvalidArgument, msg)
}
response := server.ProtoClone(in.NullVolume)
s.Volumes.NullVolumes[in.NullVolume.Name] = response
err = s.store.Set(in.NullVolume.Name, response)
if err != nil {
return nil, err
}

Check warning on line 83 in pkg/backend/null.go

View check run for this annotation

Codecov / codecov/patch

pkg/backend/null.go#L82-L83

Added lines #L82 - L83 were not covered by tests
log.Printf("CreateNullVolume: Sending to client: %v", response)
return response, nil
}
Expand All @@ -86,8 +94,13 @@ func (s *Server) DeleteNullVolume(_ context.Context, in *pb.DeleteNullVolumeRequ
return nil, err
}
// fetch object from the database
volume, ok := s.Volumes.NullVolumes[in.Name]
if !ok {
volume := new(pb.NullVolume)
found, err := s.store.Get(in.Name, volume)
if err != nil {
fmt.Printf("Failed to interact with store: %v", err)
return nil, err
}

Check warning on line 102 in pkg/backend/null.go

View check run for this annotation

Codecov / codecov/patch

pkg/backend/null.go#L100-L102

Added lines #L100 - L102 were not covered by tests
if !found {
if in.AllowMissing {
return &emptypb.Empty{}, nil
}
Expand All @@ -100,7 +113,7 @@ func (s *Server) DeleteNullVolume(_ context.Context, in *pb.DeleteNullVolumeRequ
Name: resourceID,
}
var result spdk.BdevNullDeleteResult
err := s.rpc.Call("bdev_null_delete", &params, &result)
err = s.rpc.Call("bdev_null_delete", &params, &result)
if err != nil {
log.Printf("error: %v", err)
return nil, err
Expand All @@ -111,7 +124,10 @@ func (s *Server) DeleteNullVolume(_ context.Context, in *pb.DeleteNullVolumeRequ
log.Print(msg)
return nil, status.Errorf(codes.InvalidArgument, msg)
}
delete(s.Volumes.NullVolumes, volume.Name)
err = s.store.Delete(volume.Name)
if err != nil {
return nil, err
}

Check warning on line 130 in pkg/backend/null.go

View check run for this annotation

Codecov / codecov/patch

pkg/backend/null.go#L129-L130

Added lines #L129 - L130 were not covered by tests
return &emptypb.Empty{}, nil
}

Expand All @@ -124,8 +140,9 @@ func (s *Server) UpdateNullVolume(_ context.Context, in *pb.UpdateNullVolumeRequ
return nil, err
}
// fetch object from the database
volume, ok := s.Volumes.NullVolumes[in.NullVolume.Name]
if !ok {
volume := new(pb.NullVolume)
found, err := s.store.Get(in.NullVolume.Name, volume)

Check warning

Code scanning / CodeQL

Useless assignment to local variable Warning

This definition of err is never used.
if !found {
if in.AllowMissing {
log.Printf("Got AllowMissing, create a new resource, don't return error when resource not found")
params := spdk.BdevNullCreateParams{
Expand All @@ -146,7 +163,10 @@ func (s *Server) UpdateNullVolume(_ context.Context, in *pb.UpdateNullVolumeRequ
return nil, status.Errorf(codes.InvalidArgument, msg)
}
response := server.ProtoClone(in.NullVolume)
s.Volumes.NullVolumes[in.NullVolume.Name] = response
err = s.store.Set(in.NullVolume.Name, response)
if err != nil {
return nil, err
}

Check warning on line 169 in pkg/backend/null.go

View check run for this annotation

Codecov / codecov/patch

pkg/backend/null.go#L168-L169

Added lines #L168 - L169 were not covered by tests
log.Printf("CreateNullVolume: Sending to client: %v", response)
return response, nil
}
Expand Down Expand Up @@ -193,7 +213,10 @@ func (s *Server) UpdateNullVolume(_ context.Context, in *pb.UpdateNullVolumeRequ
return nil, status.Errorf(codes.InvalidArgument, msg)
}
response := server.ProtoClone(in.NullVolume)
s.Volumes.NullVolumes[in.NullVolume.Name] = response
err = s.store.Set(in.NullVolume.Name, response)
if err != nil {
return nil, err
}

Check warning on line 219 in pkg/backend/null.go

View check run for this annotation

Codecov / codecov/patch

pkg/backend/null.go#L218-L219

Added lines #L218 - L219 were not covered by tests
return response, nil
}

Expand Down Expand Up @@ -243,8 +266,9 @@ func (s *Server) GetNullVolume(_ context.Context, in *pb.GetNullVolumeRequest) (
return nil, err
}
// fetch object from the database
volume, ok := s.Volumes.NullVolumes[in.Name]
if !ok {
volume := new(pb.NullVolume)
found, err := s.store.Get(in.Name, volume)

Check warning

Code scanning / CodeQL

Useless assignment to local variable Warning

This definition of err is never used.
if !found {
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
log.Printf("error: %v", err)
return nil, err
Expand All @@ -254,7 +278,7 @@ func (s *Server) GetNullVolume(_ context.Context, in *pb.GetNullVolumeRequest) (
Name: resourceID,
}
var result []spdk.BdevGetBdevsResult
err := s.rpc.Call("bdev_get_bdevs", &params, &result)
err = s.rpc.Call("bdev_get_bdevs", &params, &result)
if err != nil {
log.Printf("error: %v", err)
return nil, err
Expand All @@ -277,8 +301,9 @@ func (s *Server) StatsNullVolume(_ context.Context, in *pb.StatsNullVolumeReques
return nil, err
}
// fetch object from the database
volume, ok := s.Volumes.NullVolumes[in.Name]
if !ok {
volume := new(pb.NullVolume)
found, err := s.store.Get(in.Name, volume)

Check warning

Code scanning / CodeQL

Useless assignment to local variable Warning

This definition of err is never used.
if !found {
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
log.Printf("error: %v", err)
return nil, err
Expand All @@ -289,7 +314,7 @@ func (s *Server) StatsNullVolume(_ context.Context, in *pb.StatsNullVolumeReques
}
// See https://mholt.github.io/json-to-go/
var result spdk.BdevGetIostatResult
err := s.rpc.Call("bdev_get_iostat", &params, &result)
err = s.rpc.Call("bdev_get_iostat", &params, &result)
if err != nil {
log.Printf("error: %v", err)
return nil, err
Expand Down
18 changes: 10 additions & 8 deletions pkg/backend/null_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ var (
BlockSize: 512,
BlocksCount: 64,
}
testNullVolumeWithStatus = pb.NullVolume{
Name: testNullVolumeName,
BlockSize: testNullVolume.BlockSize,
BlocksCount: testNullVolume.BlocksCount,
}
)

func TestBackEnd_CreateNullVolume(t *testing.T) {
Expand Down Expand Up @@ -123,8 +128,7 @@ func TestBackEnd_CreateNullVolume(t *testing.T) {
defer testEnv.Close()

if tt.exist {
testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeName] = server.ProtoClone(&testNullVolume)
testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeName].Name = testNullVolumeName
testEnv.opiSpdkServer.store.Set(testNullVolumeName, &testNullVolumeWithStatus)
}
if tt.out != nil {
tt.out = server.ProtoClone(tt.out)
Expand Down Expand Up @@ -308,8 +312,7 @@ func TestBackEnd_UpdateNullVolume(t *testing.T) {
testEnv := createTestEnvironment(tt.spdk)
defer testEnv.Close()

testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeName] = server.ProtoClone(&testNullVolume)
testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeName].Name = testNullVolumeName
testEnv.opiSpdkServer.store.Set(testNullVolumeName, &testNullVolumeWithStatus)

request := &pb.UpdateNullVolumeRequest{NullVolume: tt.in, UpdateMask: tt.mask, AllowMissing: tt.missing}
response, err := testEnv.client.UpdateNullVolume(testEnv.ctx, request)
Expand Down Expand Up @@ -614,7 +617,7 @@ func TestBackEnd_GetNullVolume(t *testing.T) {
testEnv := createTestEnvironment(tt.spdk)
defer testEnv.Close()

testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeID] = server.ProtoClone(&testNullVolume)
testEnv.opiSpdkServer.store.Set(testNullVolumeID, &testNullVolumeWithStatus)

request := &pb.GetNullVolumeRequest{Name: tt.in}
response, err := testEnv.client.GetNullVolume(testEnv.ctx, request)
Expand Down Expand Up @@ -717,7 +720,7 @@ func TestBackEnd_StatsNullVolume(t *testing.T) {
testEnv := createTestEnvironment(tt.spdk)
defer testEnv.Close()

testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeID] = server.ProtoClone(&testNullVolume)
testEnv.opiSpdkServer.store.Set(testNullVolumeID, &testNullVolumeWithStatus)

request := &pb.StatsNullVolumeRequest{Name: tt.in}
response, err := testEnv.client.StatsNullVolume(testEnv.ctx, request)
Expand Down Expand Up @@ -830,8 +833,7 @@ func TestBackEnd_DeleteNullVolume(t *testing.T) {
testEnv := createTestEnvironment(tt.spdk)
defer testEnv.Close()

testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeName] = server.ProtoClone(&testNullVolume)
testEnv.opiSpdkServer.Volumes.NullVolumes[testNullVolumeName].Name = testNullVolumeName
testEnv.opiSpdkServer.store.Set(testNullVolumeName, &testNullVolumeWithStatus)

request := &pb.DeleteNullVolumeRequest{Name: tt.in, AllowMissing: tt.missing}
response, err := testEnv.client.DeleteNullVolume(testEnv.ctx, request)
Expand Down

0 comments on commit bdd41a0

Please sign in to comment.