fix(namespace): executor/router/buildermgr RemoveNamespace + per-NS informer lifecycle
- 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
This commit is contained in:
@@ -76,6 +76,8 @@ type (
|
||||
podSpecPatch *apiv1.PodSpec
|
||||
envWatchInformer map[string]k8sCache.SharedIndexInformer
|
||||
enableOwnerReferences bool
|
||||
// nsCancels holds per-namespace context cancel functions.
|
||||
nsCancels map[string]context.CancelFunc
|
||||
}
|
||||
)
|
||||
|
||||
@@ -111,8 +113,8 @@ func makeEnvironmentWatcher(
|
||||
podSpecPatch: podSpecPatch,
|
||||
envWatchInformer: utils.GetInformersForNamespaces(fissionClient, time.Minute*30, fv1.EnvironmentResource),
|
||||
enableOwnerReferences: utils.IsOwnerReferencesEnabled(),
|
||||
nsCancels: make(map[string]context.CancelFunc),
|
||||
}
|
||||
|
||||
err := envWatcher.EnvWatchEventHandlers(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -540,6 +542,21 @@ func (envw *environmentWatcher) AddNamespace(ctx context.Context, ns string, mgr
|
||||
|
||||
envw.envWatchInformer[ns] = envInf
|
||||
mgr.AddInformers(ctx, map[string]k8sCache.SharedIndexInformer{ns: envInf})
|
||||
factory.Start(ctx.Done())
|
||||
|
||||
// Create a per-namespace cancellable context for informer lifecycle.
|
||||
nsCtx, nsCancel := context.WithCancel(ctx)
|
||||
envw.nsCancels[ns] = nsCancel
|
||||
|
||||
factory.Start(nsCtx.Done())
|
||||
envw.logger.Info("buildermgr.envWatcher.AddNamespace: done", zap.String("namespace", ns))
|
||||
}
|
||||
|
||||
// RemoveNamespace deregisters a namespace from the environment watcher.
|
||||
func (envw *environmentWatcher) RemoveNamespace(ns string) {
|
||||
if cancel, ok := envw.nsCancels[ns]; ok {
|
||||
cancel()
|
||||
delete(envw.nsCancels, ns)
|
||||
}
|
||||
delete(envw.envWatchInformer, ns)
|
||||
envw.logger.Info("buildermgr.envWatcher.RemoveNamespace: cleaned up", zap.String("namespace", ns))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user