Skip to content

Commit 8b18c2d

Browse files
authored
fix: avoid updating the local store status (#1538)
fix: avoid update the local store status - Move RedisCluster status updates from k8sutils to controller-specific updateStatus methods - Move RedisReplication status updates to use new updateStatus method - Add common.UpdateStatus helper function for consistent status updates - Remove deprecated k8sutils.UpdateRedisClusterStatus function - Add proper deep copy and spec clearing to prevent unintended updates Signed-off-by: yangw <[email protected]>
1 parent a74c88c commit 8b18c2d

File tree

4 files changed

+62
-40
lines changed

4 files changed

+62
-40
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package common
2+
3+
import (
4+
"context"
5+
6+
"sigs.k8s.io/controller-runtime/pkg/client"
7+
)
8+
9+
func UpdateStatus(ctx context.Context, client client.Client, obj client.Object) error {
10+
return client.Status().Update(ctx, obj)
11+
}

internal/controller/rediscluster/rediscluster_controller.go

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package rediscluster
1919
import (
2020
"context"
2121
"fmt"
22+
"reflect"
2223
"time"
2324

2425
rcvb2 "github.com/OT-CONTAINER-KIT/redis-operator/api/rediscluster/v1beta2"
@@ -131,7 +132,12 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
131132
// Mark the cluster status as initializing if there are no leader or follower nodes
132133
if (instance.Status.ReadyLeaderReplicas == 0 && instance.Status.ReadyFollowerReplicas == 0) ||
133134
instance.Status.ReadyLeaderReplicas != leaderReplicas {
134-
err = k8sutils.UpdateRedisClusterStatus(ctx, instance, rcvb2.RedisClusterInitializing, rcvb2.InitializingClusterLeaderReason, instance.Status.ReadyLeaderReplicas, instance.Status.ReadyFollowerReplicas, r.Client)
135+
err = r.updateStatus(ctx, instance, rcvb2.RedisClusterStatus{
136+
State: rcvb2.RedisClusterInitializing,
137+
Reason: rcvb2.InitializingClusterLeaderReason,
138+
ReadyLeaderReplicas: instance.Status.ReadyLeaderReplicas,
139+
ReadyFollowerReplicas: instance.Status.ReadyFollowerReplicas,
140+
})
135141
if err != nil {
136142
return intctrlutil.RequeueE(ctx, err, "")
137143
}
@@ -157,7 +163,12 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
157163
// Mark the cluster status as initializing if there are no follower nodes
158164
if (instance.Status.ReadyLeaderReplicas == 0 && instance.Status.ReadyFollowerReplicas == 0) ||
159165
instance.Status.ReadyFollowerReplicas != followerReplicas {
160-
err = k8sutils.UpdateRedisClusterStatus(ctx, instance, rcvb2.RedisClusterInitializing, rcvb2.InitializingClusterFollowerReason, leaderReplicas, instance.Status.ReadyFollowerReplicas, r.Client)
166+
err = r.updateStatus(ctx, instance, rcvb2.RedisClusterStatus{
167+
State: rcvb2.RedisClusterInitializing,
168+
Reason: rcvb2.InitializingClusterFollowerReason,
169+
ReadyLeaderReplicas: leaderReplicas,
170+
ReadyFollowerReplicas: instance.Status.ReadyFollowerReplicas,
171+
})
161172
if err != nil {
162173
return intctrlutil.RequeueE(ctx, err, "")
163174
}
@@ -185,7 +196,12 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
185196

186197
// Mark the cluster status as bootstrapping if all the leader and follower nodes are ready
187198
if instance.Status.ReadyLeaderReplicas != leaderReplicas || instance.Status.ReadyFollowerReplicas != followerReplicas {
188-
err = k8sutils.UpdateRedisClusterStatus(ctx, instance, rcvb2.RedisClusterBootstrap, rcvb2.BootstrapClusterReason, leaderReplicas, followerReplicas, r.Client)
199+
err = r.updateStatus(ctx, instance, rcvb2.RedisClusterStatus{
200+
State: rcvb2.RedisClusterBootstrap,
201+
Reason: rcvb2.BootstrapClusterReason,
202+
ReadyLeaderReplicas: leaderReplicas,
203+
ReadyFollowerReplicas: followerReplicas,
204+
})
189205
if err != nil {
190206
return intctrlutil.RequeueE(ctx, err, "")
191207
}
@@ -238,7 +254,12 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
238254
logger.Error(err, "failed to determine unhealthy node count in cluster")
239255
}
240256
if int(totalReplicas) > 1 && unhealthyNodeCount > 0 {
241-
err = k8sutils.UpdateRedisClusterStatus(ctx, instance, rcvb2.RedisClusterFailed, "RedisCluster has unhealthy nodes", leaderReplicas, followerReplicas, r.Client)
257+
err = r.updateStatus(ctx, instance, rcvb2.RedisClusterStatus{
258+
State: rcvb2.RedisClusterFailed,
259+
Reason: "RedisCluster has unhealthy nodes",
260+
ReadyLeaderReplicas: leaderReplicas,
261+
ReadyFollowerReplicas: followerReplicas,
262+
})
242263
if err != nil {
243264
return intctrlutil.RequeueE(ctx, err, "")
244265
}
@@ -289,7 +310,12 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
289310
return intctrlutil.RequeueE(ctx, err, "failed to set dynamic config")
290311
}
291312

292-
err = k8sutils.UpdateRedisClusterStatus(ctx, instance, rcvb2.RedisClusterReady, rcvb2.ReadyClusterReason, leaderReplicas, followerReplicas, r.Client)
313+
err = r.updateStatus(ctx, instance, rcvb2.RedisClusterStatus{
314+
State: rcvb2.RedisClusterReady,
315+
Reason: rcvb2.ReadyClusterReason,
316+
ReadyLeaderReplicas: leaderReplicas,
317+
ReadyFollowerReplicas: followerReplicas,
318+
})
293319
if err != nil {
294320
return intctrlutil.RequeueE(ctx, err, "")
295321
}
@@ -306,6 +332,16 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
306332
return intctrlutil.RequeueAfter(ctx, time.Second*10, "")
307333
}
308334

335+
func (r *Reconciler) updateStatus(ctx context.Context, rc *rcvb2.RedisCluster, status rcvb2.RedisClusterStatus) error {
336+
if reflect.DeepEqual(rc.Status, status) {
337+
return nil
338+
}
339+
copy := rc.DeepCopy()
340+
copy.Spec = rcvb2.RedisClusterSpec{}
341+
copy.Status = status
342+
return common.UpdateStatus(ctx, r.Client, copy)
343+
}
344+
309345
// SetupWithManager sets up the controller with the Manager.
310346
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
311347
return ctrl.NewControllerManagedBy(mgr).

internal/controller/redisreplication/redisreplication_controller.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,9 @@ func (r *Reconciler) UpdateRedisReplicationMaster(ctx context.Context, instance
9090
"previous", instance.Status.MasterNode,
9191
"new", masterNode)
9292
}
93-
instance.Status.MasterNode = masterNode
94-
if err := r.Client.Status().Update(ctx, instance); err != nil {
95-
return err
96-
}
97-
return nil
93+
return r.updateStatus(ctx, instance, rrvb2.RedisReplicationStatus{
94+
MasterNode: masterNode,
95+
})
9896
}
9997

10098
type reconciler struct {
@@ -216,6 +214,13 @@ func (r *Reconciler) reconcileStatus(ctx context.Context, instance *rrvb2.RedisR
216214
return intctrlutil.Reconciled()
217215
}
218216

217+
func (r *Reconciler) updateStatus(ctx context.Context, rr *rrvb2.RedisReplication, status rrvb2.RedisReplicationStatus) error {
218+
copy := rr.DeepCopy()
219+
copy.Spec = rrvb2.RedisReplicationSpec{}
220+
copy.Status = status
221+
return common.UpdateStatus(ctx, r.Client, copy)
222+
}
223+
219224
// SetupWithManager sets up the controller with the Manager.
220225
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
221226
return ctrl.NewControllerManagedBy(mgr).

internal/k8sutils/status.go

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)