Skip to content

Commit

Permalink
csiaddons: use rbd.Manager within ReclaimSpaceControllerServer
Browse files Browse the repository at this point in the history
Signed-off-by: Niels de Vos <[email protected]>
  • Loading branch information
nixpanic committed Jan 24, 2025
1 parent dd4e1c8 commit 8cfe37a
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 13 deletions.
22 changes: 12 additions & 10 deletions internal/csi-addons/rbd/reclaimspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,18 @@ import (
// of CSI-addons reclaimspace controller service spec.
type ReclaimSpaceControllerServer struct {
*rs.UnimplementedReclaimSpaceControllerServer

driver string
volumeLocks *util.VolumeLocks
}

// NewReclaimSpaceControllerServer creates a new ReclaimSpaceControllerServer which handles
// the ReclaimSpace Service requests from the CSI-Addons specification.
func NewReclaimSpaceControllerServer(volumeLocks *util.VolumeLocks) *ReclaimSpaceControllerServer {
return &ReclaimSpaceControllerServer{volumeLocks: volumeLocks}
func NewReclaimSpaceControllerServer(driver string, volumeLocks *util.VolumeLocks) *ReclaimSpaceControllerServer {
return &ReclaimSpaceControllerServer{
driver: driver,
volumeLocks: volumeLocks,
}
}

func (rscs *ReclaimSpaceControllerServer) RegisterService(server grpc.ServiceRegistrar) {
Expand All @@ -59,26 +64,23 @@ func (rscs *ReclaimSpaceControllerServer) ControllerReclaimSpace(
return nil, status.Error(codes.InvalidArgument, "empty volume ID in request")
}

cr, err := util.NewUserCredentials(req.GetSecrets())
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
defer cr.DeleteCredentials()

if acquired := rscs.volumeLocks.TryAcquire(volumeID); !acquired {
log.ErrorLog(ctx, util.VolumeOperationAlreadyExistsFmt, volumeID)

return nil, status.Errorf(codes.Aborted, util.VolumeOperationAlreadyExistsFmt, volumeID)
}
defer rscs.volumeLocks.Release(volumeID)

rbdVol, err := rbdutil.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
mgr := rbdutil.NewManager(rscs.driver, nil, req.GetSecrets())
defer mgr.Destroy(ctx)

rbdVol, err := mgr.GetVolumeByID(ctx, volumeID)
if err != nil {
return nil, status.Errorf(codes.Aborted, "failed to find volume with ID %q: %s", volumeID, err.Error())
}
defer rbdVol.Destroy(ctx)

err = rbdVol.Sparsify()
err = rbdVol.Sparsify(ctx)
if errors.Is(err, rbdutil.ErrImageInUse) {
// FIXME: https://github.com/csi-addons/kubernetes-csi-addons/issues/406.
// treat sparsify call as no-op if volume is in use.
Expand Down
2 changes: 1 addition & 1 deletion internal/csi-addons/rbd/reclaimspace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
func TestControllerReclaimSpace(t *testing.T) {
t.Parallel()

controller := NewReclaimSpaceControllerServer(util.NewVolumeLocks())
controller := NewReclaimSpaceControllerServer("test.driver", util.NewVolumeLocks())

req := &rs.ControllerReclaimSpaceRequest{
VolumeId: "",
Expand Down
3 changes: 2 additions & 1 deletion internal/rbd/diskusage.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package rbd

import (
"context"
"fmt"
)

Expand All @@ -25,7 +26,7 @@ import (
// of the image.
// This function will return ErrImageInUse if the image is in use, since
// sparsifying an image on which i/o is in progress is not optimal.
func (ri *rbdImage) Sparsify() error {
func (ri *rbdImage) Sparsify(_ context.Context) error {
inUse, err := ri.isInUse()
if err != nil {
return fmt.Errorf("failed to check if image is in use: %w", err)
Expand Down
2 changes: 1 addition & 1 deletion internal/rbd/driver/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ func (r *Driver) setupCSIAddonsServer(conf *util.Config) error {
r.cas.RegisterService(is)

if conf.IsControllerServer {
rs := casrbd.NewReclaimSpaceControllerServer(r.cs.VolumeLocks)
rs := casrbd.NewReclaimSpaceControllerServer(conf.InstanceID, r.cs.VolumeLocks)
r.cas.RegisterService(rs)

fcs := casrbd.NewFenceControllerServer()
Expand Down
3 changes: 3 additions & 0 deletions internal/rbd/types/volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ type csiAddonsVolume interface {
// RotateEncryptionKey processes the key rotation for the RBD Volume.
RotateEncryptionKey(ctx context.Context) error

// Sparsify tries to free unused blocks of the volume from the CSI-Addons Controller.
Sparsify(ctx context.Context) error

// HandleParentImageExistence checks the image's parent.
// if the parent image does not exist and is not in trash, it returns nil.
// if the flattenMode is FlattenModeForce, it flattens the image itself.
Expand Down

0 comments on commit 8cfe37a

Please sign in to comment.