Skip to content

Commit 6d1e7f8

Browse files
committed
Determine if you need to operate resources
1 parent e4a94e9 commit 6d1e7f8

File tree

6 files changed

+68
-31
lines changed

6 files changed

+68
-31
lines changed

pkg/apis/redis/v1alpha1/distributedrediscluster_types.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,12 @@ type DistributedRedisClusterStatus struct {
104104
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
105105
// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
106106
// Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html
107-
Status ClusterStatus `json:"status"`
108-
Reason string `json:"reason,omitempty"`
109-
NumberOfMaster int32 `json:"numberOfMaster,omitempty"`
110-
Nodes []RedisClusterNode `json:"nodes"`
107+
Status ClusterStatus `json:"status"`
108+
Reason string `json:"reason,omitempty"`
109+
NumberOfMaster int32 `json:"numberOfMaster,omitempty"`
110+
MinReplicationFactor int32 `json:"minReplicationFactor,omitempty"`
111+
MaxReplicationFactor int32 `json:"maxReplicationFactor,omitempty"`
112+
Nodes []RedisClusterNode `json:"nodes"`
111113
// The number of restore which reached phase Succeeded.
112114
// +optional
113115
RestoreSucceeded int32 `json:"restoreSucceeded,omitempty"`

pkg/controller/distributedrediscluster/distributedrediscluster_controller.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ func (r *ReconcileDistributedRedisCluster) Reconcile(request reconcile.Request)
125125
}
126126

127127
ctx := &syncContext{
128-
cluster: instance,
128+
cluster: instance,
129+
reqLogger: reqLogger,
129130
}
130131

131132
err = r.ensureCluster(ctx)
@@ -185,6 +186,16 @@ func (r *ReconcileDistributedRedisCluster) Reconcile(request reconcile.Request)
185186
}
186187
}
187188

189+
requeue, err := ctx.healer.Heal(instance, clusterInfos, admin)
190+
if err != nil {
191+
return reconcile.Result{}, Redis.Wrap(err, "Heal")
192+
}
193+
if requeue {
194+
return reconcile.Result{RequeueAfter: requeueAfter}, nil
195+
}
196+
197+
ctx.admin = admin
198+
ctx.clusterInfos = clusterInfos
188199
err = r.waitForClusterJoin(ctx)
189200
if err != nil {
190201
switch GetType(err) {
@@ -215,13 +226,16 @@ func (r *ReconcileDistributedRedisCluster) Reconcile(request reconcile.Request)
215226
reqLogger.V(4).Info("buildClusterStatus", "status", status)
216227
r.updateClusterIfNeed(instance, status)
217228

218-
err = r.sync(ctx)
219-
if err != nil {
220-
new := instance.Status.DeepCopy()
221-
SetClusterFailed(new, err.Error())
222-
r.updateClusterIfNeed(instance, new)
223-
return reconcile.Result{}, err
229+
if needClusterOperation(instance, reqLogger) {
230+
err = r.sync(ctx)
231+
if err != nil {
232+
new := instance.Status.DeepCopy()
233+
SetClusterFailed(new, err.Error())
234+
r.updateClusterIfNeed(instance, new)
235+
return reconcile.Result{}, err
236+
}
224237
}
238+
225239
newClusterInfos, err := admin.GetClusterInfos()
226240
if err != nil {
227241
if clusterInfos.Status == redisutil.ClusterInfosPartial {
@@ -231,6 +245,5 @@ func (r *ReconcileDistributedRedisCluster) Reconcile(request reconcile.Request)
231245
newStatus := buildClusterStatus(newClusterInfos, redisClusterPods.Items, &instance.Status)
232246
SetClusterOK(newStatus, "OK")
233247
r.updateClusterIfNeed(instance, newStatus)
234-
//return reconcile.Result{RequeueAfter: requeueEnsure}, nil
235-
return reconcile.Result{}, nil
248+
return reconcile.Result{RequeueAfter: requeueEnsure}, nil
236249
}

pkg/controller/distributedrediscluster/helper.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net"
77
"time"
88

9+
"github.com/go-logr/logr"
910
corev1 "k8s.io/api/core/v1"
1011
"k8s.io/apimachinery/pkg/types"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -151,3 +152,22 @@ func clusterPods(pods []corev1.Pod) []*corev1.Pod {
151152
}
152153
return podSlice
153154
}
155+
156+
func needClusterOperation(cluster *redisv1alpha1.DistributedRedisCluster, reqLogger logr.Logger) bool {
157+
if compareIntValue("NumberOfMaster", &cluster.Status.NumberOfMaster, &cluster.Spec.MasterSize) {
158+
reqLogger.V(4).Info("needClusterOperation---NumberOfMaster")
159+
return true
160+
}
161+
162+
if compareIntValue("MinReplicationFactor", &cluster.Status.MinReplicationFactor, &cluster.Spec.ClusterReplicas) {
163+
reqLogger.V(4).Info("needClusterOperation---MinReplicationFactor")
164+
return true
165+
}
166+
167+
if compareIntValue("MaxReplicationFactor", &cluster.Status.MaxReplicationFactor, &cluster.Spec.ClusterReplicas) {
168+
reqLogger.V(4).Info("needClusterOperation---MaxReplicationFactor")
169+
return true
170+
}
171+
172+
return false
173+
}

pkg/controller/distributedrediscluster/init_from_backup.go

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

pkg/controller/distributedrediscluster/status.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package distributedrediscluster
22

33
import (
44
"fmt"
5+
"math"
56
"reflect"
67

78
corev1 "k8s.io/api/core/v1"
@@ -82,6 +83,22 @@ func buildClusterStatus(clusterInfos *redisutil.ClusterInfos, pods []corev1.Pod,
8283
}
8384
status.NumberOfMaster = nbMaster
8485

86+
minReplicationFactor := math.MaxInt32
87+
maxReplicationFactor := 0
88+
for _, counter := range nbSlaveByMaster {
89+
if counter > maxReplicationFactor {
90+
maxReplicationFactor = counter
91+
}
92+
if counter < minReplicationFactor {
93+
minReplicationFactor = counter
94+
}
95+
}
96+
if len(nbSlaveByMaster) == 0 {
97+
minReplicationFactor = 0
98+
}
99+
status.MaxReplicationFactor = int32(maxReplicationFactor)
100+
status.MinReplicationFactor = int32(minReplicationFactor)
101+
85102
return status
86103
}
87104

pkg/controller/distributedrediscluster/sync_handler.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ func (r *ReconcileDistributedRedisCluster) waitForClusterJoin(ctx *syncContext)
107107
//if err != nil {
108108
// return Redis.Wrap(err, "SetConfigEpoch")
109109
//}
110-
if _, err := ctx.admin.GetClusterInfos(); err == nil {
110+
if infos, err := ctx.admin.GetClusterInfos(); err == nil {
111+
ctx.reqLogger.V(5).Info("debug waitForClusterJoin", "cluster infos", infos)
111112
return nil
112113
}
113114
var firstNode *redisutil.Node
@@ -124,12 +125,7 @@ func (r *ReconcileDistributedRedisCluster) waitForClusterJoin(ctx *syncContext)
124125
// waiting for cluster join will find all the nodes agree about
125126
// the config as they are still empty with unassigned slots.
126127
time.Sleep(1 * time.Second)
127-
if _, err := ctx.healer.FixFailedNodes(ctx.cluster, ctx.clusterInfos, ctx.admin); err != nil {
128-
return Cluster.Wrap(err, "FixFailedNodes")
129-
}
130-
if _, err := ctx.healer.FixUntrustedNodes(ctx.cluster, ctx.clusterInfos, ctx.admin); err != nil {
131-
return Cluster.Wrap(err, "FixUntrustedNodes")
132-
}
128+
133129
_, err = ctx.admin.GetClusterInfos()
134130
if err != nil {
135131
return Requeue.Wrap(err, "wait for cluster join")

0 commit comments

Comments
 (0)