Skip to content

Commit e4ef85e

Browse files
Do not reconcile objects that are being deleted
If the kpack image (or its builds) has a finalizer being added by an external component, then when the client request the object to be deleted, the image/build reconcilers keep reconciling the image/build causing new build pods to be created as the image is being deleted. Even though eventually the image gets deleted, it takes significant amount of time. Co-authored-by: Georgi Sabev <georgethebeatle@gmail.com>
1 parent 5b5cd65 commit e4ef85e

File tree

11 files changed

+93
-11
lines changed

11 files changed

+93
-11
lines changed

pkg/reconciler/build/build.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ func NewController(
9999

100100
impl := controller.NewContext(ctx, c, controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger})
101101

102-
informer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
102+
informer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
103+
FilterFunc: reconciler.FilterDeletionTimestamp,
104+
Handler: controller.HandleAll(impl.Enqueue),
105+
})
103106

104107
podInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
105108
FilterFunc: controller.FilterControllerGK(buildapi.SchemeGroupVersion.WithKind(Kind).GroupKind()),

pkg/reconciler/builder/builder.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ func NewController(
8989
},
9090
controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger},
9191
)
92-
builderInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
92+
builderInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
93+
FilterFunc: reconciler.FilterDeletionTimestamp,
94+
Handler: controller.HandleAll(impl.Enqueue),
95+
})
9396

9497
c.Tracker = tracker.New(impl.EnqueueKey, opt.TrackerResyncPeriod())
9598
clusterStoreInformer.Informer().AddEventHandler(controller.HandleAll(

pkg/reconciler/buildpack/buildpack.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ func NewController(
3636
opt reconciler.Options,
3737
keychainFactory registry.KeychainFactory,
3838
buildpackInformer buildinformers.BuildpackInformer,
39-
storeReader StoreReader) *controller.Impl {
39+
storeReader StoreReader,
40+
) *controller.Impl {
4041
c := &Reconciler{
4142
Client: opt.Client,
4243
BuildpackLister: buildpackInformer.Lister(),
@@ -55,7 +56,11 @@ func NewController(
5556
},
5657
controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger},
5758
)
58-
buildpackInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
59+
buildpackInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
60+
FilterFunc: reconciler.FilterDeletionTimestamp,
61+
Handler: controller.HandleAll(impl.Enqueue),
62+
})
63+
5964
return impl
6065
}
6166

pkg/reconciler/clusterbuilder/clusterbuilder.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ func NewController(
8686
},
8787
controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger},
8888
)
89-
clusterBuilderInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
89+
clusterBuilderInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
90+
FilterFunc: reconciler.FilterDeletionTimestamp,
91+
Handler: controller.HandleAll(impl.Enqueue),
92+
})
9093

9194
c.Tracker = tracker.New(impl.EnqueueKey, opt.TrackerResyncPeriod())
9295
clusterBuildpackInformer.Informer().AddEventHandler(controller.HandleAll(

pkg/reconciler/clusterbuildpack/clusterbuildpack.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ func NewController(
3636
opt reconciler.Options,
3737
keychainFactory registry.KeychainFactory,
3838
clusterBuildpackInformer buildinformers.ClusterBuildpackInformer,
39-
storeReader StoreReader) *controller.Impl {
39+
storeReader StoreReader,
40+
) *controller.Impl {
4041
c := &Reconciler{
4142
Client: opt.Client,
4243
ClusterBuildpackLister: clusterBuildpackInformer.Lister(),
@@ -55,7 +56,10 @@ func NewController(
5556
},
5657
controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger},
5758
)
58-
clusterBuildpackInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
59+
clusterBuildpackInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
60+
FilterFunc: reconciler.FilterDeletionTimestamp,
61+
Handler: controller.HandleAll(impl.Enqueue),
62+
})
5963
return impl
6064
}
6165

pkg/reconciler/clusterstack/clusterstack.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ func NewController(
5555
},
5656
controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger},
5757
)
58-
clusterStackInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
58+
clusterStackInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
59+
FilterFunc: reconciler.FilterDeletionTimestamp,
60+
Handler: controller.HandleAll(impl.Enqueue),
61+
})
5962
return impl
6063
}
6164

pkg/reconciler/clusterstore/clusterstore.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ func NewController(
5555
},
5656
controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger},
5757
)
58-
clusterStoreInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
58+
clusterStoreInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
59+
FilterFunc: reconciler.FilterDeletionTimestamp,
60+
Handler: controller.HandleAll(impl.Enqueue),
61+
})
5962
return impl
6063
}
6164

pkg/reconciler/filter.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package reconciler
2+
3+
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4+
5+
func FilterDeletionTimestamp(obj interface{}) bool {
6+
object, ok := obj.(metav1.Object)
7+
if !ok {
8+
return false
9+
}
10+
11+
return object.GetDeletionTimestamp() == nil
12+
}

pkg/reconciler/filter_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package reconciler_test
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
buildapi "github.com/pivotal/kpack/pkg/apis/build/v1alpha2"
8+
"github.com/pivotal/kpack/pkg/reconciler"
9+
"github.com/sclevine/spec"
10+
"github.com/stretchr/testify/require"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
)
13+
14+
func TestFilterDeletionTimestamp(t *testing.T) {
15+
spec.Run(t, "FilterDeletionTimestamp", testFilterDeletionTimestamp)
16+
}
17+
18+
func testFilterDeletionTimestamp(t *testing.T, when spec.G, it spec.S) {
19+
when("#FilterDeletionTimestamp", func() {
20+
it("returns true", func() {
21+
require.True(t, reconciler.FilterDeletionTimestamp(&buildapi.Build{}))
22+
})
23+
24+
when("object is deleted", func() {
25+
it("returns false", func() {
26+
require.False(t, reconciler.FilterDeletionTimestamp(buildapi.Build{
27+
ObjectMeta: metav1.ObjectMeta{
28+
DeletionTimestamp: &metav1.Time{Time: time.Now()},
29+
},
30+
}))
31+
})
32+
})
33+
34+
when("not an object", func() {
35+
it("returns false", func() {
36+
require.False(t, reconciler.FilterDeletionTimestamp("not an object"))
37+
})
38+
})
39+
})
40+
}

pkg/reconciler/image/image.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ func NewController(
6363

6464
impl := controller.NewContext(ctx, c, controller.ControllerOptions{WorkQueueName: ReconcilerName, Logger: logger})
6565

66-
imageInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
66+
imageInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
67+
FilterFunc: reconciler.FilterDeletionTimestamp,
68+
Handler: controller.HandleAll(impl.Enqueue),
69+
})
6770

6871
buildInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
6972
FilterFunc: controller.FilterControllerGK(buildapi.SchemeGroupVersion.WithKind(Kind).GroupKind()),

0 commit comments

Comments
 (0)