Skip to content

Commit 3ae6672

Browse files
nixpanicmergify[bot]
authored andcommitted
reclaimspace: send ControllerReclaimSpace operations to the leading controller
Just like NetworkFence operations should be sent to a preferred Controller Server, the OFFLINE ReclaimSpace operations should be sent there as well. Updates: #422 Signed-off-by: Niels de Vos <ndevos@ibm.com>
1 parent 0e14403 commit 3ae6672

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

controllers/csiaddons/reclaimspacejob_controller.go

+32-13
Original file line numberDiff line numberDiff line change
@@ -343,17 +343,38 @@ func (r *ReclaimSpaceJobReconciler) getTargetDetails(
343343
return &details, nil
344344
}
345345

346-
// getRSClientWithCap returns ReclaimSpaceClient given driverName, nodeID and capabilityType.
347-
func (r *ReclaimSpaceJobReconciler) getRSClientWithCap(
348-
driverName, nodeID string,
349-
capType identity.Capability_ReclaimSpace_Type) (string, proto.ReclaimSpaceClient) {
346+
// getLeadingRSClient returns ReclaimSpaceClient that holds the lease given driverName.
347+
func (r *ReclaimSpaceJobReconciler) getLeadingRSClient(
348+
ctx context.Context,
349+
client client.Client,
350+
driverName string) (proto.ReclaimSpaceClient, error) {
351+
conn, err := r.ConnPool.GetLeaderByDriver(ctx, r.Client, driverName)
352+
if err != nil {
353+
return nil, err
354+
}
355+
356+
for _, cap := range conn.Capabilities {
357+
if cap.GetReclaimSpace() == nil {
358+
continue
359+
}
360+
if cap.GetReclaimSpace().Type == identity.Capability_ReclaimSpace_OFFLINE {
361+
return proto.NewReclaimSpaceClient(conn.Client), nil
362+
}
363+
}
364+
365+
return nil, fmt.Errorf("leading controller for driver %q does not support ReclaimSpace_OFFLINE", driverName)
366+
}
367+
368+
// getRSClientByNode returns ReclaimSpaceClient given driverName and nodeID.
369+
func (r *ReclaimSpaceJobReconciler) getRSClientByNode(
370+
driverName, nodeID string) (string, proto.ReclaimSpaceClient) {
350371
conns := r.ConnPool.GetByNodeID(driverName, nodeID)
351372
for k, v := range conns {
352373
for _, cap := range v.Capabilities {
353374
if cap.GetReclaimSpace() == nil {
354375
continue
355376
}
356-
if cap.GetReclaimSpace().Type == capType {
377+
if cap.GetReclaimSpace().Type == identity.Capability_ReclaimSpace_ONLINE {
357378
return k, proto.NewReclaimSpaceClient(v.Client)
358379
}
359380
}
@@ -372,12 +393,11 @@ func (r *ReclaimSpaceJobReconciler) controllerReclaimSpace(
372393
ctx context.Context,
373394
logger *logr.Logger,
374395
target *targetDetails) (bool, *int64, error) {
375-
clientName, controllerClient := r.getRSClientWithCap(target.driverName, "", identity.Capability_ReclaimSpace_OFFLINE)
376-
if controllerClient == nil {
377-
logger.Info("Controller Client not found")
378-
return false, nil, nil
396+
controllerClient, err := r.getLeadingRSClient(ctx, r.Client, target.driverName)
397+
if err != nil {
398+
logger.Info("Controller Client not found: %v", err)
399+
return false, nil, err
379400
}
380-
*logger = logger.WithValues("controllerClient", clientName)
381401

382402
logger.Info("Making controller reclaim space request")
383403
req := &proto.ReclaimSpaceRequest{
@@ -407,10 +427,9 @@ func (r *ReclaimSpaceJobReconciler) nodeReclaimSpace(
407427
ctx context.Context,
408428
logger *logr.Logger,
409429
target *targetDetails) (*int64, error) {
410-
clientName, nodeClient := r.getRSClientWithCap(
430+
clientName, nodeClient := r.getRSClientByNode(
411431
target.driverName,
412-
target.nodeID,
413-
identity.Capability_ReclaimSpace_ONLINE)
432+
target.nodeID)
414433
if nodeClient == nil {
415434
return nil, fmt.Errorf("node Client not found for %q nodeID", target.nodeID)
416435
}

0 commit comments

Comments
 (0)