Skip to content

Commit 5823d1b

Browse files
authored
Merge pull request #2791 from alvaroaleman/add-default-transform
✨ Add TransformStripManagedFields
2 parents ae0f6ab + 4cf9db0 commit 5823d1b

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

Diff for: pkg/cache/cache.go

+17
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ type Options struct {
201201

202202
// DefaultTransform will be used as transform for all object types
203203
// unless there is already one set in ByObject or DefaultNamespaces.
204+
//
205+
// A typical usecase for this is to use TransformStripManagedFields
206+
// to reduce the caches memory usage.
204207
DefaultTransform toolscache.TransformFunc
205208

206209
// DefaultWatchErrorHandler will be used to the WatchErrorHandler which is called
@@ -344,6 +347,20 @@ func New(cfg *rest.Config, opts Options) (Cache, error) {
344347
return delegating, nil
345348
}
346349

350+
// TransformStripManagedFields strips the managed fields of an object before it is committed to the cache.
351+
// If you are not explicitly accessing managedFields from your code, setting this as `DefaultTransform`
352+
// on the cache can lead to a significant reduction in memory usage.
353+
func TransformStripManagedFields() toolscache.TransformFunc {
354+
return func(in any) (any, error) {
355+
// Nilcheck managed fields to avoid hitting https://github.com/kubernetes/kubernetes/issues/124337
356+
if obj, err := meta.Accessor(in); err == nil && obj.GetManagedFields() != nil {
357+
obj.SetManagedFields(nil)
358+
}
359+
360+
return in, nil
361+
}
362+
}
363+
347364
func optionDefaultsToConfig(opts *Options) Config {
348365
return Config{
349366
LabelSelector: opts.DefaultLabelSelector,

Diff for: pkg/cache/cache_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -2421,6 +2421,25 @@ func CacheTest(createCacheFunc func(config *rest.Config, opts cache.Options) (ca
24212421
})
24222422
}
24232423

2424+
var _ = Describe("TransformStripManagedFields", func() {
2425+
It("should strip managed fields from an object", func() {
2426+
obj := &corev1.Pod{ObjectMeta: metav1.ObjectMeta{
2427+
ManagedFields: []metav1.ManagedFieldsEntry{{
2428+
Manager: "foo",
2429+
}},
2430+
}}
2431+
transformed, err := cache.TransformStripManagedFields()(obj)
2432+
Expect(err).NotTo(HaveOccurred())
2433+
Expect(transformed).To(Equal(&corev1.Pod{ObjectMeta: metav1.ObjectMeta{}}))
2434+
})
2435+
2436+
It("should not trip over an unexpected object", func() {
2437+
transformed, err := cache.TransformStripManagedFields()("foo")
2438+
Expect(err).NotTo(HaveOccurred())
2439+
Expect(transformed).To(Equal("foo"))
2440+
})
2441+
})
2442+
24242443
// ensureNamespace installs namespace of a given name if not exists.
24252444
func ensureNamespace(namespace string, client client.Client) error {
24262445
ns := corev1.Namespace{

0 commit comments

Comments
 (0)