layer1: guard router informer maps step 6
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user