v5.0.64: delete idempotency, duplicate adopt, defer unlock, exist marker

This commit is contained in:
“Naeel”
2026-07-07 10:08:50 +04:00
parent 4ac21d9367
commit d70bf5d171
12 changed files with 349 additions and 73 deletions
@@ -0,0 +1,35 @@
# 2026-07-07 — Opus analysis: duplicate/exist subresource adopt
## Контекст
После фикса mutex (v5.0.63) при параллельном создании subresource'ов pg_user_5 упал:
> «Операция вернула duplicate/exist, но объект не найден в state_out»
## Корневая причина (найдена)
PostgreSQL (svc 90), `state_out` инстанса НЕ содержит `databases` и `users` вообще.
Артефакт: `artifacts/output_inventory/running_suspended_output_fields_for_docs.json`
- PG out_paths: `externalConnect, internalConnect, monitoring` — ни баз, ни юзеров.
Для Kafka (svc 116) ключи есть, но называются `kafkaUsers` и `kafkaTopics` (не `users`/`topics`).
### Почему adopt subresource'а не работает
`subresource_guard.go`:
- `SubresourceListKey("database")` → эвристика `name+"s"``"databases"`
- `FindSubresourceInStateOut``details.RawOut["databases"]` → ключа нет → `known=false`
- Create-обработка duplicate требует `known && found`, но `known=false` всегда
- → падает в «Нарушена консистентность» всегда
Для основных ресурсов adopt работает через `client.FindInstanceByDisplayName` — реальный запрос к API инстансов. Для subresource'ов такого API нет.
## Дополнительные вопросы для Опуса
1. Есть ли в API отдельные эндпоинты `list_databases`/`list_users` для PostgreSQL, которые можно дёргать вместо парсинга `state_out`?
2. `SubresourceListKey`/`SubresourceIdentityKey` — эвристики `name+"s"` и special-map на 2 сервиса. Нужен явный маппинг из YAML-метаданных (реальные ключи: `kafkaUsers`, `kafkaTopics`).
3. При `known=false` (ключ не найден в state_out) — должен ли adopt доверять ошибке `already exists` от API и усыновлять без подтверждения? Сейчас падает в «Нарушена консистентность».
4. `IsSubresourceAlreadyExistsError` — достаточно ли маркеров `уже существует/already exists/duplicate/conflict`? Что если API вернёт HTTP 409 без текста или другую формулировку?
**Дата:** 2026-07-07