From 4c74624228a80c255b033c39d12a1980cf298ca4 Mon Sep 17 00:00:00 2001 From: Donnie Adams Date: Wed, 26 Feb 2025 08:50:21 -0500 Subject: [PATCH] fix: stop locking when reading from triggers We can read lock when registering a trigger to see if that trigger needs to be added, and only lock when the trigger needs to be added. This will allow for more bandwidth when processing objects. Signed-off-by: Donnie Adams --- pkg/router/trigger.go | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/pkg/router/trigger.go b/pkg/router/trigger.go index 8f54464..9e49115 100644 --- a/pkg/router/trigger.go +++ b/pkg/router/trigger.go @@ -57,31 +57,53 @@ func (m *triggers) invokeTriggers(req Request) { } func (m *triggers) register(gvk schema.GroupVersionKind, key string, targetGVK schema.GroupVersionKind, mr objectMatcher) { - m.lock.Lock() - defer m.lock.Unlock() + matcherKey := mr.String() + if !m.shouldAddTrigger(gvk, key, targetGVK, matcherKey) { + return + } target := enqueueTarget{ key: key, gvk: gvk, } + + m.lock.Lock() + defer m.lock.Unlock() + matchers, ok := m.matchers[groupVersionKind{targetGVK}] if !ok { - matchers = map[enqueueTarget]map[string]objectMatcher{} + matchers = make(map[enqueueTarget]map[string]objectMatcher, 1) m.matchers[groupVersionKind{targetGVK}] = matchers } - matcherKey := mr.String() if _, ok := matchers[target][matcherKey]; ok { return } if matchers[target] == nil { - matchers[target] = map[string]objectMatcher{} + matchers[target] = make(map[string]objectMatcher, 1) } matchers[target][matcherKey] = mr } +func (m *triggers) shouldAddTrigger(gvk schema.GroupVersionKind, key string, targetGVK schema.GroupVersionKind, matcherKey string) bool { + m.lock.RLock() + defer m.lock.RUnlock() + + target := enqueueTarget{ + key: key, + gvk: gvk, + } + matchers, ok := m.matchers[groupVersionKind{targetGVK}] + if !ok { + return true + } + + _, ok = matchers[target][matcherKey] + return !ok +} + func (m *triggers) Trigger(req Request) { if !req.FromTrigger { m.invokeTriggers(req)