v5.0.63: instance-level mutex to prevent parallel operations on same resource
This commit is contained in:
@@ -128,3 +128,51 @@ tf_provider/
|
||||
**Остаётся риск:**
|
||||
- `RunInstanceOperationUniversalByCode` (client.go:1399) всё ещё делает GET — может упасть для service_operation_resource на проблемных инстансах
|
||||
- `CreateGenericInstanceUniversalV6` (client.go:224) — CREATE на инстансах где resourceRealm = Struct может упасть
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ BUG: Параллельные операции на одном инстансе ломаются
|
||||
|
||||
**Симптом:** При создании нескольких subresource'ов (user, database) на одном postgres-инстансе:
|
||||
- `ошибка API 500: Cannot connect to the orchestrator` — бэкенд не справляется с параллельными запросами
|
||||
- `операция завершилась успешно, но объект не найден в state_out` — user создался, но RefreshResourceState не видит его
|
||||
- `экземпляр не готов: операция в ожидании` — инстанс занят предыдущей операцией
|
||||
|
||||
**Причина:** Terraform по умолчанию параллелит до 10 ресурсов (`-parallelism=10`). Все операции на одном инстансе (5 user'ов + 7 database'ов) стартуют одновременно → гонка на бэкенде.
|
||||
|
||||
**Пример:** 2026-07-07 на инстансе `5111108D`:
|
||||
- 5 user'ов создавались параллельно: user_2 ok, user_1+user_3 — orchestrator error, user_4+user_5 — state_out не найден
|
||||
- 7 database'ов упали: инстанс не готов
|
||||
|
||||
**План исправления:** mutex map в провайдере (стандартный подход как в AWS/GCP провайдерах):
|
||||
|
||||
```go
|
||||
// client.go — глобальная карта мьютексов
|
||||
var instanceMutexes sync.Map // key: instanceUid
|
||||
|
||||
func (c *UniversalClient) lockInstance(instanceUid string) func() {
|
||||
mu, _ := c.instanceMutexes.LoadOrStore(instanceUid, &sync.Mutex{})
|
||||
mu.(*sync.Mutex).Lock()
|
||||
return func() { mu.(*sync.Mutex).Unlock() }
|
||||
}
|
||||
```
|
||||
|
||||
Вызывать в каждом CRUD:
|
||||
```go
|
||||
unlock := client.lockInstance(instanceID)
|
||||
defer unlock()
|
||||
```
|
||||
|
||||
**Альтернативы (хуже):**
|
||||
- `depends_on` цепочкой в конфиге — неудобно, требует ручной правки .tf
|
||||
- `-parallelism=1` — замедляет ВСЕ ресурсы, не только subresource'ы
|
||||
|
||||
**Затрагивает:**
|
||||
- Все subresource-операции (postgres_user, postgres_database, mariadb_user, clickhouse_user, etc.)
|
||||
- Modify + delete на одном инстансе тоже могут столкнуться
|
||||
|
||||
**Статус:** ⚠️ OPEN — не исправлено
|
||||
**Файлы для правки:**
|
||||
- `/home/naeel/tf_provider/provider/internal/core/client.go` — добавить mutex map + lockInstance
|
||||
- `/home/naeel/tf_provider/provider/internal/resources_core/crud.go` — добавить lock/unlock в Create/Update/Delete
|
||||
- `/home/naeel/tf_provider/provider/internal/resources_core/service_operation_resource.go` — добавить lock/unlock
|
||||
|
||||
Reference in New Issue
Block a user