layer1: guard router informer maps step 6
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user