34 lines
1.4 KiB
Markdown
34 lines
1.4 KiB
Markdown
# 2026-04-26 — NamespaceManager rewrite, step 6
|
||
|
||
## Цель шага
|
||
|
||
Закрыть race-surface в router вокруг динамического добавления namespace informer-ов.
|
||
|
||
## Проблема
|
||
|
||
В router есть два связанных mutable map:
|
||
|
||
- `HTTPTriggerSet.triggerInformer`
|
||
- `HTTPTriggerSet.funcInformer`
|
||
|
||
`AddNamespace()` пишет в них на лету, а `updateRouter()` одновременно итерируется по ним.
|
||
Кроме того, `functionReferenceResolver` получает `funcInformer` map и читает ее без синхронизации.
|
||
|
||
Это делает dynamic onboarding потенциальным источником:
|
||
|
||
- `concurrent map iteration and map write`;
|
||
- чтения неполного снимка informer-ов;
|
||
- гонок между router rebuild и resolver lookup.
|
||
|
||
## Исправление
|
||
|
||
1. В `HTTPTriggerSet` добавляется `RWMutex` для informer maps.
|
||
2. Чтение informer-ов переводится на snapshot helpers.
|
||
3. `functionReferenceResolver` получает собственный lock и метод `addInformer()`.
|
||
4. `router.AddNamespace()` обновляет router map и resolver map под контролируемым доступом.
|
||
|
||
## Что НЕ меняем
|
||
|
||
- не переписываем router lifecycle целиком;
|
||
- не добавляем remove semantics;
|
||
- не меняем trigger/function business logic. |