layer1: guard router informer maps step 6

This commit is contained in:
Naeel
2026-04-26 09:37:09 +03:00
parent 94f26b69ee
commit 87477d4529
3 changed files with 76 additions and 6 deletions
+31 -6
View File
@@ -21,6 +21,7 @@ import (
"fmt"
"net/http"
"strings"
"sync"
"time"
"github.com/bep/debounce"
@@ -58,6 +59,7 @@ type HTTPTriggerSet struct {
triggerInformer map[string]k8sCache.SharedIndexInformer
functions []fv1.Function
funcInformer map[string]k8sCache.SharedIndexInformer
informerMu sync.RWMutex
updateRouterRequestChannel chan struct{}
tsRoundTripperParams *tsRoundTripperParams
isDebugEnv bool
@@ -310,7 +312,7 @@ func (ts *HTTPTriggerSet) updateTriggerStatusFailed(ht *fv1.HTTPTrigger, err err
}
func (ts *HTTPTriggerSet) addTriggerHandlers() error {
for _, triggerInformer := range ts.triggerInformer {
for _, triggerInformer := range ts.snapshotTriggerInformers() {
_, err := triggerInformer.AddEventHandler(k8sCache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
trigger := obj.(*fv1.HTTPTrigger)
@@ -342,7 +344,7 @@ func (ts *HTTPTriggerSet) addTriggerHandlers() error {
}
func (ts *HTTPTriggerSet) addFunctionHandlers() error {
for _, funcInformer := range ts.funcInformer {
for _, funcInformer := range ts.snapshotFuncInformers() {
_, err := funcInformer.AddEventHandler(k8sCache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
@@ -389,6 +391,28 @@ func (ts *HTTPTriggerSet) syncTriggers() {
})
}
func (ts *HTTPTriggerSet) snapshotTriggerInformers() []k8sCache.SharedIndexInformer {
ts.informerMu.RLock()
defer ts.informerMu.RUnlock()
informers := make([]k8sCache.SharedIndexInformer, 0, len(ts.triggerInformer))
for _, informer := range ts.triggerInformer {
informers = append(informers, informer)
}
return informers
}
func (ts *HTTPTriggerSet) snapshotFuncInformers() []k8sCache.SharedIndexInformer {
ts.informerMu.RLock()
defer ts.informerMu.RUnlock()
informers := make([]k8sCache.SharedIndexInformer, 0, len(ts.funcInformer))
for _, informer := range ts.funcInformer {
informers = append(informers, informer)
}
return informers
}
func (ts *HTTPTriggerSet) updateRouter(ctx context.Context) {
for {
select {
@@ -398,7 +422,7 @@ func (ts *HTTPTriggerSet) updateRouter(ctx context.Context) {
}
// get triggers
alltriggers := make([]fv1.HTTPTrigger, 0)
for _, triggerInformer := range ts.triggerInformer {
for _, triggerInformer := range ts.snapshotTriggerInformers() {
latestTriggers := triggerInformer.GetStore().List()
for _, t := range latestTriggers {
alltriggers = append(alltriggers, *t.(*fv1.HTTPTrigger))
@@ -409,7 +433,7 @@ func (ts *HTTPTriggerSet) updateRouter(ctx context.Context) {
// get functions
allfunctions := make([]fv1.Function, 0)
functionTimeout := make(map[types.UID]int, 0)
for _, funcInformer := range ts.funcInformer {
for _, funcInformer := range ts.snapshotFuncInformers() {
latestFunctions := funcInformer.GetStore().List()
for _, f := range latestFunctions {
fn := *f.(*fv1.Function)
@@ -492,10 +516,11 @@ func (ts *HTTPTriggerSet) AddNamespace(ctx context.Context, ns string, mgr manag
return fmt.Errorf("router.AddNamespace %s: func handler: %w", ns, err)
}
// ts.funcInformer and resolver.funcInformer are the same map reference —
// updating ts.funcInformer also makes the resolver aware of the new namespace.
ts.informerMu.Lock()
ts.triggerInformer[ns] = triggerInf
ts.funcInformer[ns] = funcInf
ts.informerMu.Unlock()
ts.resolver.addInformer(ns, funcInf)
mgr.AddInformers(ctx, map[string]k8sCache.SharedIndexInformer{
ns + "/trigger": triggerInf,