Skip to content

Commit 8ccd8f1

Browse files
authored
reconcile all channels every 1 min instead of watching managed cluster status for better performance (#88)
Signed-off-by: Xiangjing Li <[email protected]>
1 parent 1b8ace6 commit 8ccd8f1

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

pkg/controller/channel/channel_controller.go

+14-12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"fmt"
2020
"reflect"
2121
"strings"
22+
"time"
2223

2324
spokeClusterV1 "open-cluster-management.io/api/cluster/v1"
2425
chv1 "open-cluster-management.io/multicloud-operators-channel/pkg/apis/apps/v1"
@@ -72,6 +73,7 @@ const (
7273
controllerName = "channel"
7374
controllerSetup = "channel-setup"
7475
backupLabel = "cluster.open-cluster-management.io/backup"
76+
requeuAfter = 1 * time.Minute
7577
)
7678

7779
/**
@@ -116,9 +118,9 @@ func add(mgr manager.Manager, r reconcile.Reconciler, logger logr.Logger) error
116118
}
117119

118120
// Watching managed cluster changes has been removed.
119-
// For any managed cluster reconcile events(create, update, delete), don't trigger the automatic role/rolebing update for all channels.
120121
// It turns out an expensive action if there are > 1000 managed clusters. The OOMKilled issue would hit easiy due to tons of duplicate reconciliations
121-
// In this case, users should manually update channel cr to trigger the role/rolebinding update.
122+
// To trigger the automatic role/rolebing update for all channels, every channel is enforced to reconcile every 1 minute.
123+
// So all managed cluster add/removal will be reflected to the channel rolebindings in 1 minute.
122124

123125
return err
124126
}
@@ -157,19 +159,19 @@ func (r *ReconcileChannel) Reconcile(ctx context.Context, request reconcile.Requ
157159
// For additional cleanup logic use finalizers.
158160
//sync the channel to the serving-channel annotation in all involved secrets - remove channel
159161
if err := r.syncReferredObjAnnotationLabel(request, nil, srtGvk, log); err != nil {
160-
return reconcile.Result{}, err
162+
return reconcile.Result{RequeueAfter: requeuAfter}, err
161163
}
162164

163165
//remove the channel from the serving-channel annotation in all involved ConfigMaps - remove channel
164166
if err := r.syncReferredObjAnnotationLabel(request, nil, cmGvk, log); err != nil {
165-
return reconcile.Result{}, err
167+
return reconcile.Result{RequeueAfter: requeuAfter}, err
166168
}
167169

168-
return reconcile.Result{}, nil
170+
return reconcile.Result{RequeueAfter: requeuAfter}, nil
169171
}
170172

171173
// Error reading the object - requeue the request.
172-
return reconcile.Result{}, err
174+
return reconcile.Result{RequeueAfter: requeuAfter}, err
173175
}
174176

175177
if (strings.EqualFold(string(instance.Spec.Type), chv1.ChannelTypeNamespace)) && (instance.Spec.Pathname != instance.GetNamespace()) {
@@ -178,10 +180,10 @@ func (r *ReconcileChannel) Reconcile(ctx context.Context, request reconcile.Requ
178180
err := r.Update(context.TODO(), instance)
179181
if err != nil {
180182
log.Info(fmt.Sprintf("can't update the pathname field due to %v", err))
181-
return reconcile.Result{}, err
183+
return reconcile.Result{RequeueAfter: requeuAfter}, err
182184
}
183185

184-
return reconcile.Result{}, nil
186+
return reconcile.Result{RequeueAfter: requeuAfter}, nil
185187
}
186188

187189
// find the channel controller pod namespace, it is running in the ACM namespece
@@ -190,20 +192,20 @@ func (r *ReconcileChannel) Reconcile(ctx context.Context, request reconcile.Requ
190192
err = r.validateClusterRBAC(instance, log, mchNamespace)
191193
if err != nil {
192194
log.Error(err, fmt.Sprintf("failed to validate RBAC for clusters for channel %v", instance.Name))
193-
return reconcile.Result{}, err
195+
return reconcile.Result{RequeueAfter: requeuAfter}, err
194196
}
195197

196198
if err := r.handleReferencedObjects(instance, request, log); err != nil {
197-
return reconcile.Result{}, err
199+
return reconcile.Result{RequeueAfter: requeuAfter}, err
198200
}
199201

200202
err = r.cleanRoleFromAcmNS(instance, log, mchNamespace)
201203
if err != nil {
202204
log.Error(err, "failed to clean up channel role/rolebinding in the ACM system NameSpace")
203-
return reconcile.Result{}, err
205+
return reconcile.Result{RequeueAfter: requeuAfter}, err
204206
}
205207

206-
return reconcile.Result{}, nil
208+
return reconcile.Result{RequeueAfter: requeuAfter}, nil
207209
}
208210

209211
func (r *ReconcileChannel) handleReferencedObjects(instance *chv1.Channel, req reconcile.Request, log logr.Logger) error {

0 commit comments

Comments
 (0)