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.