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:
@@ -49,6 +49,8 @@ type (
|
||||
pkgInformer map[string]k8sCache.SharedIndexInformer
|
||||
storageSvcUrl string
|
||||
buildCache *cache.Cache[crd.CacheKeyUR, *fv1.Package]
|
||||
// nsCancels holds per-namespace context cancel functions.
|
||||
nsCancels map[string]context.CancelFunc
|
||||
}
|
||||
)
|
||||
|
||||
@@ -64,6 +66,7 @@ func makePackageWatcher(logger *zap.Logger, fissionClient versioned.Interface, k
|
||||
pkgInformer: pkgInformer,
|
||||
storageSvcUrl: storageSvcUrl,
|
||||
buildCache: cache.MakeCache[crd.CacheKeyUR, *fv1.Package](0, 0),
|
||||
nsCancels: make(map[string]context.CancelFunc),
|
||||
}
|
||||
return pkgw
|
||||
}
|
||||
@@ -363,7 +366,23 @@ func (pkgw *packageWatcher) AddNamespace(ctx context.Context, ns string, mgr man
|
||||
ns + "/pkg": pkgInf,
|
||||
ns + "/pod": podInf,
|
||||
})
|
||||
fissionFactory.Start(ctx.Done())
|
||||
podFactory.Start(ctx.Done())
|
||||
|
||||
// Create a per-namespace cancellable context for informer lifecycle.
|
||||
nsCtx, nsCancel := context.WithCancel(ctx)
|
||||
pkgw.nsCancels[ns] = nsCancel
|
||||
|
||||
fissionFactory.Start(nsCtx.Done())
|
||||
podFactory.Start(nsCtx.Done())
|
||||
pkgw.logger.Info("buildermgr.pkgWatcher.AddNamespace: done", zap.String("namespace", ns))
|
||||
}
|
||||
|
||||
// RemoveNamespace deregisters a namespace from the package watcher.
|
||||
func (pkgw *packageWatcher) RemoveNamespace(ns string) {
|
||||
if cancel, ok := pkgw.nsCancels[ns]; ok {
|
||||
cancel()
|
||||
delete(pkgw.nsCancels, ns)
|
||||
}
|
||||
delete(pkgw.pkgInformer, ns)
|
||||
delete(pkgw.podInformer, ns)
|
||||
pkgw.logger.Info("buildermgr.pkgWatcher.RemoveNamespace: cleaned up", zap.String("namespace", ns))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user