layer1: fix buildermgr namespace dedup step 4
This commit is contained in:
@@ -0,0 +1,32 @@
|
|||||||
|
# 2026-04-26 — NamespaceManager rewrite, step 4
|
||||||
|
|
||||||
|
## Цель шага
|
||||||
|
|
||||||
|
Исправить реальный functional bug в dynamic onboarding buildermgr.
|
||||||
|
|
||||||
|
## Дефект
|
||||||
|
|
||||||
|
`buildermgr.StartNSWatcher()` вызывает:
|
||||||
|
|
||||||
|
1. `envw.AddNamespace()`
|
||||||
|
2. `pkgw.AddNamespace()`
|
||||||
|
|
||||||
|
Но оба watcher-а используют один и тот же глобальный `nsResolver.AddNamespace()` для dedup.
|
||||||
|
Из-за этого первый вызов добавляет namespace, а второй считает его уже обработанным и
|
||||||
|
выходит раньше времени. В результате у динамического tenant namespace может подняться только
|
||||||
|
Environment informer без Package informer.
|
||||||
|
|
||||||
|
## Исправление
|
||||||
|
|
||||||
|
1. Глобальный resolver обновляется один раз в `buildermgr/ns_watcher.go`.
|
||||||
|
2. `environmentWatcher` dedup делает только по своей map `envWatchInformer`.
|
||||||
|
3. `packageWatcher` dedup делает только по своим map `pkgInformer` / `podInformer`.
|
||||||
|
|
||||||
|
Так buildermgr становится симметричнее executor path: общий registry обновляется один раз,
|
||||||
|
а конкретные компоненты сами решают, подписаны ли они уже на namespace.
|
||||||
|
|
||||||
|
## Что НЕ меняем
|
||||||
|
|
||||||
|
- не добавляем cleanup/remove semantics;
|
||||||
|
- не меняем router;
|
||||||
|
- не трогаем newdeploy parity gap на этом шаге.
|
||||||
@@ -501,9 +501,9 @@ func (envw *environmentWatcher) createBuilderDeployment(ctx context.Context, env
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddNamespace dynamically registers a new namespace in environmentWatcher.
|
// AddNamespace dynamically registers a new namespace in environmentWatcher.
|
||||||
// Creates a per-NS Environment informer. Safe to call repeatedly — deduplicates via nsResolver.
|
// Creates a per-NS Environment informer. Safe to call repeatedly — deduplicates via env informer map.
|
||||||
func (envw *environmentWatcher) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) {
|
func (envw *environmentWatcher) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) {
|
||||||
if !envw.nsResolver.AddNamespace(ns) {
|
if _, exists := envw.envWatchInformer[ns]; exists {
|
||||||
return // already registered
|
return // already registered
|
||||||
}
|
}
|
||||||
envw.logger.Info("buildermgr.envWatcher.AddNamespace: setting up informer", zap.String("namespace", ns))
|
envw.logger.Info("buildermgr.envWatcher.AddNamespace: setting up informer", zap.String("namespace", ns))
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
k8sCache "k8s.io/client-go/tools/cache"
|
k8sCache "k8s.io/client-go/tools/cache"
|
||||||
|
|
||||||
|
"github.com/fission/fission/pkg/utils"
|
||||||
"github.com/fission/fission/pkg/utils/manager"
|
"github.com/fission/fission/pkg/utils/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -47,6 +48,7 @@ func StartNSWatcher(
|
|||||||
if ns == "" {
|
if ns == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
utils.DefaultNSResolver().AddNamespace(ns)
|
||||||
envw.AddNamespace(ctx, ns, mgr)
|
envw.AddNamespace(ctx, ns, mgr)
|
||||||
pkgw.AddNamespace(ctx, ns, mgr)
|
pkgw.AddNamespace(ctx, ns, mgr)
|
||||||
},
|
},
|
||||||
@@ -55,6 +57,7 @@ func StartNSWatcher(
|
|||||||
if !ok || nsObj.Labels[builderManagedNSLabel] != "true" {
|
if !ok || nsObj.Labels[builderManagedNSLabel] != "true" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
utils.DefaultNSResolver().AddNamespace(nsObj.Name)
|
||||||
envw.AddNamespace(ctx, nsObj.Name, mgr)
|
envw.AddNamespace(ctx, nsObj.Name, mgr)
|
||||||
pkgw.AddNamespace(ctx, nsObj.Name, mgr)
|
pkgw.AddNamespace(ctx, nsObj.Name, mgr)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -333,9 +333,9 @@ func setInitialBuildStatus(ctx context.Context, fissionClient versioned.Interfac
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddNamespace dynamically registers a new namespace in packageWatcher.
|
// AddNamespace dynamically registers a new namespace in packageWatcher.
|
||||||
// Creates per-NS Package and Pod informers. Safe to call repeatedly.
|
// Creates per-NS Package and Pod informers. Safe to call repeatedly — deduplicates via local informer maps.
|
||||||
func (pkgw *packageWatcher) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) {
|
func (pkgw *packageWatcher) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) {
|
||||||
if !pkgw.nsResolver.AddNamespace(ns) {
|
if _, exists := pkgw.pkgInformer[ns]; exists {
|
||||||
return // already registered
|
return // already registered
|
||||||
}
|
}
|
||||||
pkgw.logger.Info("buildermgr.pkgWatcher.AddNamespace: setting up informers", zap.String("namespace", ns))
|
pkgw.logger.Info("buildermgr.pkgWatcher.AddNamespace: setting up informers", zap.String("namespace", ns))
|
||||||
|
|||||||
Reference in New Issue
Block a user