Skip to content

Commit ed22001

Browse files
committed
chore: small performance updates
Allow client operations to be cached, but not add triggers. Use a map instead of a slice for storing trigger matchers for quicker retrieval. Signed-off-by: Donnie Adams <[email protected]>
1 parent 2210c89 commit ed22001

File tree

8 files changed

+137
-60
lines changed

8 files changed

+137
-60
lines changed

pkg/router/handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func NewHandlerSet(name string, scheme *runtime.Scheme, backend backend.Backend)
5959
handlers: map[schema.GroupVersionKind][]Handler{},
6060
},
6161
triggers: triggers{
62-
matchers: map[schema.GroupVersionKind]map[enqueueTarget][]objectMatcher{},
62+
matchers: map[schema.GroupVersionKind]map[enqueueTarget]map[string]objectMatcher{},
6363
trigger: backend,
6464
gvkLookup: backend,
6565
scheme: scheme,
@@ -317,7 +317,7 @@ func (m *HandlerSet) handle(gvk schema.GroupVersionKind, key string, unmodifiedO
317317
}
318318

319319
if unmodifiedObject == nil {
320-
// A nil object here means tha the object was deleted, so unregister the triggers
320+
// A nil object here means that the object was deleted, so unregister the triggers
321321
m.triggers.UnregisterAndTrigger(req)
322322
} else {
323323
m.triggers.Trigger(req)

pkg/router/matcher.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ type objectMatcher struct {
1313
Fields fields.Selector
1414
}
1515

16+
func (o *objectMatcher) String() string {
17+
s := o.Name + "/" + o.Namespace
18+
if o.Selector != nil {
19+
s += "/label selectors" + o.Selector.String()
20+
}
21+
if o.Fields != nil {
22+
s += "/field selectors" + o.Fields.String()
23+
}
24+
return s
25+
}
26+
1627
func (o *objectMatcher) Equals(other objectMatcher) bool {
1728
if o.Name != other.Name {
1829
return false

pkg/router/tester/types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
"github.com/google/uuid"
1111
"github.com/obot-platform/nah/pkg/router"
12-
"github.com/obot-platform/nah/pkg/uncached"
12+
"github.com/obot-platform/nah/pkg/untriggered"
1313
"golang.org/x/exp/maps"
1414
"k8s.io/apimachinery/pkg/api/errors"
1515
meta2 "k8s.io/apimachinery/pkg/api/meta"
@@ -38,7 +38,7 @@ func (c Client) objects() []kclient.Object {
3838
}
3939

4040
func (c *Client) Get(ctx context.Context, key kclient.ObjectKey, out kclient.Object, opts ...kclient.GetOption) error {
41-
if u, ok := out.(*uncached.Holder); ok {
41+
if u, ok := out.(*untriggered.Holder); ok {
4242
out = u.Object
4343
}
4444
t := reflect.TypeOf(out)
@@ -73,7 +73,7 @@ func copy(dest, src kclient.Object) {
7373
}
7474

7575
func (c *Client) List(ctx context.Context, objList kclient.ObjectList, opts ...kclient.ListOption) error {
76-
if u, ok := objList.(*uncached.HolderList); ok {
76+
if u, ok := objList.(*untriggered.HolderList); ok {
7777
objList = u.ObjectList
7878
}
7979

pkg/router/trigger.go

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
"github.com/obot-platform/nah/pkg/backend"
88
"github.com/obot-platform/nah/pkg/log"
9-
"github.com/obot-platform/nah/pkg/uncached"
9+
"github.com/obot-platform/nah/pkg/untriggered"
1010
"k8s.io/apimachinery/pkg/fields"
1111
"k8s.io/apimachinery/pkg/labels"
1212
"k8s.io/apimachinery/pkg/runtime"
@@ -16,7 +16,7 @@ import (
1616

1717
type triggers struct {
1818
lock sync.RWMutex
19-
matchers map[schema.GroupVersionKind]map[enqueueTarget][]objectMatcher
19+
matchers map[schema.GroupVersionKind]map[enqueueTarget]map[string]objectMatcher
2020
trigger backend.Trigger
2121
gvkLookup backend.Backend
2222
scheme *runtime.Scheme
@@ -36,15 +36,15 @@ func (m *triggers) invokeTriggers(req Request) {
3636
m.lock.RLock()
3737
defer m.lock.RUnlock()
3838

39-
for enqueueTarget, matchers := range m.matchers[req.GVK] {
40-
if enqueueTarget.gvk == req.GVK &&
41-
enqueueTarget.key == req.Key {
39+
for et, matchers := range m.matchers[req.GVK] {
40+
if et.gvk == req.GVK &&
41+
et.key == req.Key {
4242
continue
4343
}
4444
for _, matcher := range matchers {
4545
if matcher.Match(req.Namespace, req.Name, req.Object) {
46-
log.Debugf("Triggering [%s] [%v] from [%s] [%v]", enqueueTarget.key, enqueueTarget.gvk, req.Key, req.GVK)
47-
_ = m.trigger.Trigger(enqueueTarget.gvk, enqueueTarget.key, 0)
46+
log.Debugf("Triggering [%s] [%v] from [%s] [%v]", et.key, et.gvk, req.Key, req.GVK)
47+
_ = m.trigger.Trigger(et.gvk, et.key, 0)
4848
break
4949
}
5050
}
@@ -61,15 +61,20 @@ func (m *triggers) register(gvk schema.GroupVersionKind, key string, targetGVK s
6161
}
6262
matchers, ok := m.matchers[targetGVK]
6363
if !ok {
64-
matchers = map[enqueueTarget][]objectMatcher{}
64+
matchers = map[enqueueTarget]map[string]objectMatcher{}
6565
m.matchers[targetGVK] = matchers
6666
}
67-
for _, existing := range matchers[target] {
68-
if existing.Equals(mr) {
69-
return
70-
}
67+
68+
matcherKey := mr.String()
69+
if _, ok := matchers[target][matcherKey]; ok {
70+
return
71+
}
72+
73+
if matchers[target] == nil {
74+
matchers[target] = map[string]objectMatcher{}
7175
}
72-
matchers[target] = append(matchers[target], mr)
76+
77+
matchers[target][matcherKey] = mr
7378
}
7479

7580
func (m *triggers) Trigger(req Request) {
@@ -79,7 +84,7 @@ func (m *triggers) Trigger(req Request) {
7984
}
8085

8186
func (m *triggers) Register(sourceGVK schema.GroupVersionKind, key string, obj runtime.Object, namespace, name string, selector labels.Selector, fields fields.Selector) (schema.GroupVersionKind, bool, error) {
82-
if uncached.IsWrapped(obj) {
87+
if untriggered.IsWrapped(obj) {
8388
return schema.GroupVersionKind{}, false, nil
8489
}
8590
gvk, err := m.gvkLookup.GVKForObject(obj, m.scheme)
@@ -107,7 +112,7 @@ func (m *triggers) UnregisterAndTrigger(req Request) {
107112
m.lock.Lock()
108113
defer m.lock.Unlock()
109114

110-
remainingMatchers := map[schema.GroupVersionKind]map[enqueueTarget][]objectMatcher{}
115+
remainingMatchers := map[schema.GroupVersionKind]map[enqueueTarget]map[string]objectMatcher{}
111116

112117
for targetGVK, matchers := range m.matchers {
113118
for target, mts := range matchers {
@@ -119,9 +124,12 @@ func (m *triggers) UnregisterAndTrigger(req Request) {
119124
if targetGVK != req.GVK || mt.Namespace != req.Namespace || mt.Name != req.Name {
120125
// If the matcher matches the deleted object exactly, then skip the matcher.
121126
if remainingMatchers[targetGVK] == nil {
122-
remainingMatchers[targetGVK] = make(map[enqueueTarget][]objectMatcher)
127+
remainingMatchers[targetGVK] = make(map[enqueueTarget]map[string]objectMatcher)
128+
}
129+
if remainingMatchers[targetGVK][target] == nil {
130+
remainingMatchers[targetGVK][target] = make(map[string]objectMatcher)
123131
}
124-
remainingMatchers[targetGVK][target] = append(remainingMatchers[targetGVK][target], mt)
132+
remainingMatchers[targetGVK][target][mt.String()] = mt
125133
}
126134
if targetGVK == req.GVK && mt.Match(req.Namespace, req.Name, req.Object) {
127135
log.Debugf("Triggering [%s] [%v] from [%s] [%v] on delete", target.key, target.gvk, req.Key, req.GVK)

pkg/runtime/backend.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"github.com/obot-platform/nah/pkg/backend"
1313
"github.com/obot-platform/nah/pkg/fields"
1414
"github.com/obot-platform/nah/pkg/router"
15-
"github.com/obot-platform/nah/pkg/uncached"
15+
"github.com/obot-platform/nah/pkg/untriggered"
1616
"k8s.io/apimachinery/pkg/runtime"
1717
"k8s.io/apimachinery/pkg/runtime/schema"
1818
kcache "k8s.io/client-go/tools/cache"
@@ -167,7 +167,7 @@ func (b *Backend) IsObjectNamespaced(obj runtime.Object) (bool, error) {
167167
}
168168

169169
func (b *Backend) GVKForObject(obj runtime.Object, scheme *runtime.Scheme) (schema.GroupVersionKind, error) {
170-
return apiutil.GVKForObject(uncached.Unwrap(obj), scheme)
170+
return apiutil.GVKForObject(untriggered.Unwrap(obj), scheme)
171171
}
172172

173173
func (b *Backend) IndexField(ctx context.Context, obj kclient.Object, field string, extractValue kclient.IndexerFunc) error {

pkg/runtime/cached.go

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"sync"
88
"time"
99

10-
"github.com/obot-platform/nah/pkg/uncached"
10+
"github.com/obot-platform/nah/pkg/untriggered"
1111
apierrors "k8s.io/apimachinery/pkg/api/errors"
1212
"k8s.io/apimachinery/pkg/api/meta"
1313
"k8s.io/apimachinery/pkg/runtime"
@@ -115,8 +115,11 @@ func (c *cacheClient) store(obj kclient.Object) {
115115
}
116116

117117
func (c *cacheClient) Get(ctx context.Context, key kclient.ObjectKey, obj kclient.Object, opts ...kclient.GetOption) error {
118-
if u, ok := obj.(*uncached.Holder); ok {
119-
return c.uncached.Get(ctx, key, u.Object, opts...)
118+
if u, ok := obj.(*untriggered.Holder); ok {
119+
obj = u.Object
120+
if u.IsUncached() {
121+
return c.uncached.Get(ctx, key, obj, opts...)
122+
}
120123
}
121124

122125
getErr := c.cached.Get(ctx, key, obj)
@@ -155,15 +158,21 @@ func (c *cacheClient) Get(ctx context.Context, key kclient.ObjectKey, obj kclien
155158
}
156159

157160
func (c *cacheClient) List(ctx context.Context, list kclient.ObjectList, opts ...kclient.ListOption) error {
158-
if u, ok := list.(*uncached.HolderList); ok {
159-
return c.uncached.List(ctx, u.ObjectList, opts...)
161+
if u, ok := list.(*untriggered.HolderList); ok {
162+
list = u.ObjectList
163+
if u.IsUncached() {
164+
return c.uncached.List(ctx, u, opts...)
165+
}
160166
}
161167
return c.cached.List(ctx, list, opts...)
162168
}
163169

164170
func (c *cacheClient) Create(ctx context.Context, obj kclient.Object, opts ...kclient.CreateOption) error {
165-
if u, ok := obj.(*uncached.Holder); ok {
166-
return c.uncached.Create(ctx, u.Object, opts...)
171+
if u, ok := obj.(*untriggered.Holder); ok {
172+
obj = u.Object
173+
if u.IsUncached() {
174+
return c.uncached.Create(ctx, obj, opts...)
175+
}
167176
}
168177
err := c.cached.Create(ctx, obj, opts...)
169178
if err != nil {
@@ -174,8 +183,11 @@ func (c *cacheClient) Create(ctx context.Context, obj kclient.Object, opts ...kc
174183
}
175184

176185
func (c *cacheClient) Delete(ctx context.Context, obj kclient.Object, opts ...kclient.DeleteOption) error {
177-
if u, ok := obj.(*uncached.Holder); ok {
178-
return c.uncached.Delete(ctx, u.Object, opts...)
186+
if u, ok := obj.(*untriggered.Holder); ok {
187+
obj = u.Object
188+
if u.IsUncached() {
189+
return c.uncached.Delete(ctx, obj, opts...)
190+
}
179191
}
180192
err := c.cached.Delete(ctx, obj, opts...)
181193
if err != nil {
@@ -186,8 +198,11 @@ func (c *cacheClient) Delete(ctx context.Context, obj kclient.Object, opts ...kc
186198
}
187199

188200
func (c *cacheClient) Update(ctx context.Context, obj kclient.Object, opts ...kclient.UpdateOption) error {
189-
if u, ok := obj.(*uncached.Holder); ok {
190-
return c.uncached.Update(ctx, u.Object, opts...)
201+
if u, ok := obj.(*untriggered.Holder); ok {
202+
obj = u.Object
203+
if u.IsUncached() {
204+
return c.uncached.Update(ctx, obj, opts...)
205+
}
191206
}
192207
err := c.cached.Update(ctx, obj, opts...)
193208
if err != nil {
@@ -198,8 +213,11 @@ func (c *cacheClient) Update(ctx context.Context, obj kclient.Object, opts ...kc
198213
}
199214

200215
func (c *cacheClient) Patch(ctx context.Context, obj kclient.Object, patch kclient.Patch, opts ...kclient.PatchOption) error {
201-
if u, ok := obj.(*uncached.Holder); ok {
202-
return c.uncached.Patch(ctx, u.Object, patch, opts...)
216+
if u, ok := obj.(*untriggered.Holder); ok {
217+
obj = u.Object
218+
if u.IsUncached() {
219+
return c.uncached.Patch(ctx, obj, patch, opts...)
220+
}
203221
}
204222
err := c.cached.Patch(ctx, obj, patch, opts...)
205223
if err != nil {
@@ -210,6 +228,12 @@ func (c *cacheClient) Patch(ctx context.Context, obj kclient.Object, patch kclie
210228
}
211229

212230
func (c *cacheClient) DeleteAllOf(ctx context.Context, obj kclient.Object, opts ...kclient.DeleteAllOfOption) error {
231+
if u, ok := obj.(*untriggered.Holder); ok {
232+
obj = u.Object
233+
if u.IsUncached() {
234+
return c.uncached.DeleteAllOf(ctx, obj, opts...)
235+
}
236+
}
213237
return c.cached.DeleteAllOf(ctx, obj, opts...)
214238
}
215239

@@ -248,15 +272,15 @@ type subResourceClient struct {
248272
}
249273

250274
func (s *subResourceClient) Get(ctx context.Context, obj kclient.Object, subResource kclient.Object, opts ...kclient.SubResourceGetOption) error {
251-
return s.reader.Get(ctx, uncached.Unwrap(obj).(kclient.Object), subResource, opts...)
275+
return s.reader.Get(ctx, untriggered.Unwrap(obj).(kclient.Object), subResource, opts...)
252276
}
253277

254278
func (s *subResourceClient) Create(ctx context.Context, obj kclient.Object, subResource kclient.Object, opts ...kclient.SubResourceCreateOption) error {
255-
return s.writer.Create(ctx, uncached.Unwrap(obj).(kclient.Object), subResource, opts...)
279+
return s.writer.Create(ctx, untriggered.Unwrap(obj).(kclient.Object), subResource, opts...)
256280
}
257281

258282
func (s *subResourceClient) Update(ctx context.Context, obj kclient.Object, opts ...kclient.SubResourceUpdateOption) error {
259-
err := s.writer.Update(ctx, uncached.Unwrap(obj).(kclient.Object), opts...)
283+
err := s.writer.Update(ctx, untriggered.Unwrap(obj).(kclient.Object), opts...)
260284
if err != nil {
261285
return err
262286
}
@@ -265,7 +289,7 @@ func (s *subResourceClient) Update(ctx context.Context, obj kclient.Object, opts
265289
}
266290

267291
func (s *subResourceClient) Patch(ctx context.Context, obj kclient.Object, patch kclient.Patch, opts ...kclient.SubResourcePatchOption) error {
268-
err := s.writer.Patch(ctx, uncached.Unwrap(obj).(kclient.Object), patch, opts...)
292+
err := s.writer.Patch(ctx, untriggered.Unwrap(obj).(kclient.Object), patch, opts...)
269293
if err != nil {
270294
return err
271295
}

pkg/runtime/multi/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"fmt"
66

7-
"github.com/obot-platform/nah/pkg/uncached"
7+
"github.com/obot-platform/nah/pkg/untriggered"
88
"k8s.io/apimachinery/pkg/api/meta"
99
"k8s.io/apimachinery/pkg/runtime"
1010
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -155,7 +155,7 @@ func (m multiClient) Watch(ctx context.Context, obj kclient.ObjectList, opts ...
155155
}
156156

157157
func (m multiClient) getClient(obj runtime.Object) (kclient.WithWatch, error) {
158-
gvk, err := m.GroupVersionKindFor(uncached.Unwrap(obj))
158+
gvk, err := m.GroupVersionKindFor(untriggered.Unwrap(obj))
159159
if err != nil {
160160
return nil, err
161161
}

0 commit comments

Comments
 (0)