- Add RemoveNamespace(ctx, ns) to executortype.ExecutorType interface - Implement RemoveNamespace in poolmgr, newdeploy, container executor types - Add per-namespace context cancellation (nsCancels map) in all three types so informer factories are stopped when namespace is removed (fixes goroutine leak) - Add PoolPodController.RemoveNamespace to clear envLister/podLister maps - Add deregisterNamespace() in executor multitenant subscriber - Switch executor/router/buildermgr watcher strategy from TrackOnly to DispatchRemove so RemoveFunc is called when fission.io/managed label is removed - Add RemoveFunc to executor/router/buildermgr namespace subscribers - Add RemoveNamespace to environmentWatcher and packageWatcher with per-NS cancel - Add RemoveNamespace to HTTPTriggerSet: cancels informers, removes from maps, calls syncTriggers - Fix ns_watcher_test.go fakeExecutorType to implement new RemoveNamespace method Fixes: - Executor dedup gap: re-added namespace was silently skipped (envLister/deplLister still present) - Goroutine/FD leak: old informer factories ran forever after namespace removal - Router stale routes: HTTPTriggers for removed namespace stayed in routing table
69 lines
1.9 KiB
Go
69 lines
1.9 KiB
Go
package buildermgr
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/fission/fission/pkg/utils"
|
|
"github.com/fission/fission/pkg/utils/manager"
|
|
)
|
|
|
|
type builderEnvNamespaceAdder interface {
|
|
AddNamespace(ctx context.Context, ns string, mgr manager.Interface)
|
|
}
|
|
|
|
type builderEnvNamespaceRemover interface {
|
|
RemoveNamespace(ns string)
|
|
}
|
|
|
|
type builderPkgNamespaceAdder interface {
|
|
AddNamespace(ctx context.Context, ns string, mgr manager.Interface)
|
|
}
|
|
|
|
type builderPkgNamespaceRemover interface {
|
|
RemoveNamespace(ns string)
|
|
}
|
|
|
|
func NewNamespaceSubscriber(envw builderEnvNamespaceAdder, pkgw builderPkgNamespaceAdder, mgr manager.Interface) utils.NamespaceSubscriber {
|
|
return utils.NamespaceSubscriberFuncs{
|
|
SubscriberName: "buildermgr",
|
|
AddFunc: func(ctx context.Context, record utils.NamespaceRecord) error {
|
|
registerBuilderNamespace(ctx, record.Name, envw, pkgw, mgr)
|
|
return nil
|
|
},
|
|
RemoveFunc: func(ctx context.Context, record utils.NamespaceRecord) error {
|
|
deregisterBuilderNamespace(record.Name, envw, pkgw)
|
|
return nil
|
|
},
|
|
ResyncFunc: func(ctx context.Context, record utils.NamespaceRecord) error {
|
|
registerBuilderNamespace(ctx, record.Name, envw, pkgw, mgr)
|
|
return nil
|
|
},
|
|
}
|
|
}
|
|
|
|
func registerBuilderNamespace(ctx context.Context, namespace string, envw builderEnvNamespaceAdder, pkgw builderPkgNamespaceAdder, mgr manager.Interface) {
|
|
if namespace == "" {
|
|
return
|
|
}
|
|
utils.DefaultNSResolver().AddNamespace(namespace)
|
|
if envw != nil {
|
|
envw.AddNamespace(ctx, namespace, mgr)
|
|
}
|
|
if pkgw != nil {
|
|
pkgw.AddNamespace(ctx, namespace, mgr)
|
|
}
|
|
}
|
|
|
|
func deregisterBuilderNamespace(namespace string, envw builderEnvNamespaceAdder, pkgw builderPkgNamespaceAdder) {
|
|
if namespace == "" {
|
|
return
|
|
}
|
|
utils.DefaultNSResolver().RemoveNamespace(namespace)
|
|
if r, ok := envw.(builderEnvNamespaceRemover); ok {
|
|
r.RemoveNamespace(namespace)
|
|
}
|
|
if r, ok := pkgw.(builderPkgNamespaceRemover); ok {
|
|
r.RemoveNamespace(namespace)
|
|
}
|
|
}
|