Skip to content

Commit b1578df

Browse files
author
Per Goncalves da Silva
committed
[CARRY] address gc queue problem
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 10e0bf9 commit b1578df

File tree

8 files changed

+112
-68
lines changed

8 files changed

+112
-68
lines changed

staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/controller-runtime/client"
78
"strings"
89
"time"
910

@@ -896,7 +897,7 @@ func (a *Operator) syncObject(obj interface{}) (syncError error) {
896897
} else {
897898
switch metaObj.(type) {
898899
case *rbacv1.ClusterRole, *rbacv1.ClusterRoleBinding, *admissionregistrationv1.MutatingWebhookConfiguration, *admissionregistrationv1.ValidatingWebhookConfiguration:
899-
if syncError = a.objGCQueueSet.Requeue(metaObj.GetNamespace(), metaObj.GetName()); syncError != nil {
900+
if syncError = a.objGCQueueSet.RequeueObject(metaObj.(client.Object)); syncError != nil {
900901
logger.WithError(syncError).Warnf("failed to requeue gc event: %s/%s", metaObj.GetNamespace(), metaObj.GetName())
901902
}
902903
return
@@ -1163,7 +1164,7 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
11631164
logger.WithError(err).Warn("cannot list cluster role bindings")
11641165
}
11651166
for _, crb := range crbs {
1166-
if err := a.objGCQueueSet.Requeue(crb.GetNamespace(), crb.GetName()); err != nil {
1167+
if err := a.objGCQueueSet.RequeueObject(crb); err != nil {
11671168
logger.WithError(err).Warnf("failed to requeue gc event: %v", crb)
11681169
}
11691170
}
@@ -1173,7 +1174,7 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
11731174
logger.WithError(err).Warn("cannot list cluster roles")
11741175
}
11751176
for _, cr := range crs {
1176-
if err := a.objGCQueueSet.Requeue(cr.GetNamespace(), cr.GetName()); err != nil {
1177+
if err := a.objGCQueueSet.RequeueObject(cr); err != nil {
11771178
logger.WithError(err).Warnf("failed to requeue gc event: %v", cr)
11781179
}
11791180
}
@@ -1185,7 +1186,7 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
11851186
}
11861187
for _, webhook := range mWebhooks.Items {
11871188
w := webhook
1188-
if err := a.objGCQueueSet.Requeue(w.GetNamespace(), w.GetName()); err != nil {
1189+
if err := a.objGCQueueSet.RequeueObject(&w); err != nil {
11891190
logger.WithError(err).Warnf("failed to requeue gc event: %v", webhook)
11901191
}
11911192
}
@@ -1196,7 +1197,7 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
11961197
}
11971198
for _, webhook := range vWebhooks.Items {
11981199
w := webhook
1199-
if err := a.objGCQueueSet.Requeue(w.GetNamespace(), w.GetName()); err != nil {
1200+
if err := a.objGCQueueSet.RequeueObject(&w); err != nil {
12001201
logger.WithError(err).Warnf("failed to requeue gc event: %v", webhook)
12011202
}
12021203
}

staging/operator-lifecycle-manager/pkg/lib/queueinformer/config.go

-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ func (c *queueInformerConfig) validateQueueInformer() (err error) {
5151
err = newInvalidConfigError("nil logger")
5252
case config.queue == nil:
5353
err = newInvalidConfigError("nil queue")
54-
case config.indexer == nil:
55-
err = newInvalidConfigError("nil indexer")
5654
case config.syncer == nil:
5755
err = newInvalidConfigError("nil syncer")
5856
}

staging/operator-lifecycle-manager/pkg/lib/queueinformer/queueinformer_operator.go

+32-27
Original file line numberDiff line numberDiff line change
@@ -281,36 +281,41 @@ func (o *operator) processNextWorkItem(ctx context.Context, loop *QueueInformer)
281281
logger := o.logger.WithField("item", item)
282282
logger.WithField("queue-length", queue.Len()).Trace("popped queue")
283283

284-
typedItem, ok := item.(types.NamespacedName)
285-
if !ok {
286-
panic(fmt.Sprintf("item %T is not a NamespacedName", item))
287-
}
288-
key := keyForNamespacedName(typedItem)
289-
logger = logger.WithField("cache-key", key)
290-
291-
// Get the current cached version of the resource
292-
var exists bool
293-
var err error
294-
resource, exists, err := loop.indexer.GetByKey(key)
295-
if err != nil {
296-
logger.WithError(err).Error("cache get failed")
297-
queue.Forget(item)
298-
return true
299-
}
300-
if !exists {
301-
logger.WithField("existing-cache-keys", loop.indexer.ListKeys()).Debug("cache get failed, key not in cache")
302-
queue.Forget(item)
303-
return true
304-
}
305-
obj, ok := resource.(client.Object)
306-
if !ok {
307-
logger.Warn("cached object is not a kubernetes resource (client.Object)")
308-
queue.Forget(item)
309-
return true
284+
var obj client.Object
285+
switch typedItem := item.(type) {
286+
case types.NamespacedName:
287+
key := keyForNamespacedName(typedItem)
288+
logger = logger.WithField("cache-key", key)
289+
290+
// Get the current cached version of the resource
291+
var exists bool
292+
var err error
293+
resource, exists, err := loop.indexer.GetByKey(key)
294+
if err != nil {
295+
logger.WithError(err).Error("cache get failed")
296+
queue.Forget(item)
297+
return true
298+
}
299+
if !exists {
300+
logger.WithField("existing-cache-keys", loop.indexer.ListKeys()).Debug("cache get failed, key not in cache")
301+
queue.Forget(item)
302+
return true
303+
}
304+
var ok bool
305+
obj, ok = resource.(client.Object)
306+
if !ok {
307+
logger.Warn("cached object is not a kubernetes resource (client.Object)")
308+
queue.Forget(item)
309+
return true
310+
}
311+
case client.Object:
312+
obj = typedItem
313+
default:
314+
panic(fmt.Sprintf("unexpected item type %T", item))
310315
}
311316

312317
// Sync and requeue on error
313-
err = loop.Sync(ctx, obj)
318+
err := loop.Sync(ctx, obj)
314319
if requeues := queue.NumRequeues(item); err != nil && requeues < 8 {
315320
logger.WithField("requeues", requeues).Trace("requeuing with rate limiting")
316321
utilruntime.HandleError(errors.Wrap(err, fmt.Sprintf("sync %q failed", item)))

staging/operator-lifecycle-manager/pkg/lib/queueinformer/resourcequeue.go

+18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package queueinformer
22

33
import (
44
"fmt"
5+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/controller-runtime/client"
56
"k8s.io/apimachinery/pkg/types"
67
"sync"
78
"time"
@@ -39,6 +40,23 @@ func (r *ResourceQueueSet) Set(key string, queue workqueue.RateLimitingInterface
3940
r.queueSet[key] = queue
4041
}
4142

43+
type ClientObjectWrapper struct {
44+
client.Object
45+
}
46+
47+
func (r ClientObjectWrapper) String() string {
48+
gvk := r.Object.GetObjectKind().GroupVersionKind()
49+
return fmt.Sprintf("%s/%s/%s/%s/%s", gvk.Group, gvk.Version, gvk.Kind, r.GetNamespace(), r.GetName())
50+
}
51+
52+
// RequeueObject requeues a client object
53+
func (r *ResourceQueueSet) RequeueObject(obj client.Object) error {
54+
if queue, ok := r.queueSet[obj.GetNamespace()]; ok {
55+
queue.Add(ClientObjectWrapper{obj})
56+
}
57+
return nil
58+
}
59+
4260
// Requeue requeues the resource in the set with the given name and namespace
4361
func (r *ResourceQueueSet) Requeue(namespace, name string) error {
4462
r.mutex.RLock()

vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go

+6-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer/config.go

-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer/queueinformer_operator.go

+32-27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer/resourcequeue.go

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)