Skip to content

ADR 0042: ограниченное подтверждение владения storage ​

Статус: принято для текущего runtime. Репликация и автоматическое переключение между независимыми серверами этим решением не вводятся.

Проблема ​

Writer/worker удерживали advisory locks выделенным PostgreSQL-соединением. Доступность зависела от события сетевой ошибки. При соединении, которое молча перестало передавать пакеты, проверка могла продолжать считать процесс владельцем дольше допустимого. Это препятствует дальнейшему безопасному проектированию кластерного профиля.

Решение ​

Владение соединением вынесено из PostgresCatalog в StorageOwnership; получение существующих блокировок — в storage-claim. Порядок захвата profile/writer/maintenance/content-pin barriers сохранён. Исключение размера ARCH-008 удалено.

Каждые две секунды процесс проверяет наличие всех своих advisory locks через то же соединение. Запрос ограничен двумя секундами; при задержке соединение уничтожается. Локальное окно наблюдения ограничено восемью секундами от начала последнего успешного запроса. Проверяются монотонные и календарные часы: пауза процесса или перевод часов назад не должны продлевать владение. Запоздалый ответ не возрождает истёкшее окно.

При ошибке, потере блокировок или истечении окна владение теряется необратимо. Соединение не возвращается в pool. Повторный claim после успешного получения владения тем же экземпляром каталога запрещён. Неудачный startup допускает повторную попытку после освобождения всех частично полученных блокировок; параллельные попытки запрещены. Новый процесс заново проходит все barriers. Close ожидает завершения соединения. API/readers используют прежний available callback для readiness и transfer admission, worker — catalog.active; upload mutations дополнительно проверяют потерю владения.

Граница гарантий ​

Это ограниченное наблюдение за PostgreSQL-сессией, не fencing token и не гарантия атомарной отмены всех уже исполняющихся SQL/filesystem операций. Запросы других адаптеров используют отдельные соединения; начатая операция ОС не отменяется уничтожением SQL-сессии. Старая копия PostgreSQL при split brain может показывать свои локальные locks. Автоматическое продвижение второго физического узла только по этому heartbeat запрещено.

Настоящее переключение требует согласованной репликации каталога, blobs и подтверждённых multipart-частей, внешнего арбитража/fencing старого узла и проверки актуальности кандидата. Документ TWO_NODE_PLAN сохраняет статус проекта. Отсутствие стендовых испытаний не заменяется локальными тестами.

Проверки ​

Детерминированные unit tests проверяют latency, истечение, поздний ответ, suspend, rollback часов и необратимую остановку. Интеграционные проверки с реальным PostgreSQL проверяют молча оборванный TCP-канал standalone writer, принудительное завершение owner session, запрет повторного claim и запуск нового владельца на прежнем согласованном root. Общий integration gate сохраняет проверки readers, очистки и multipart.

Arkvory · ProAnimaStudio