From 9f7ceb581554e954d47731b3b609a90afc8a84d4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 00:55:13 +0100 Subject: [PATCH] Document REQUEST acknowledgment before external transaction commit --- doc/encrypted_attachments.md | 9 ++++++++- src/chat/chat_attachment.h | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/encrypted_attachments.md b/doc/encrypted_attachments.md index d614aa7e..60076df1 100644 --- a/doc/encrypted_attachments.md +++ b/doc/encrypted_attachments.md @@ -136,7 +136,14 @@ REQUEST=1, REQUEST_ACK=2, GRANT=3, DENY=4, RESULT_ACK=5 ответ только от автора, по своему существующему запросу и точной идентичности контейнера. Конфликтующие ключи и результаты отклоняются. -REQUEST_ACK отправляется после сохранения запроса. GRANT/DENY появляются +Приём REQUEST пока использует SAVEPOINT: REQUEST_ACK и событие следуют после RELEASE. +Без внешней транзакции это фиксирует запрос. Внутри внешней транзакции подтверждение +может уйти до commit: последующий rollback удаляет запрос у автора, а получатель уже +перешёл в state=1 и удалил REQUEST из outbox. Ожидание сохраняется после restart автора +при живых маршрутах. Этот отдельный дефект приёма ещё не исправлен; +доказательства — [chat_audit_findings.txt](chat_audit_findings.txt), «Аудит приёма REQUEST». + +GRANT/DENY появляются в outbox в одной собственной BEGIN IMMEDIATE/COMMIT с решением автора. Проверка прав также выполняется внутри неё. Изменяется ровно один входящий запрос в state=0; уже принятое решение повторной командой не заменяется. Общий помощник записи outbox diff --git a/src/chat/chat_attachment.h b/src/chat/chat_attachment.h index 98f67d32..e018ba22 100644 --- a/src/chat/chat_attachment.h +++ b/src/chat/chat_attachment.h @@ -6,7 +6,9 @@ * Ответы REQUEST_ACK/GRANT/DENY/RESULT_ACK атомарно меняют ключ, запрос и outbox собственной транзакцией. * Внешняя транзакция для ответов запрещена. GRANT/DENY подтверждаются только после проверенного commit; * повтор с тем же результатом допустим, конфликтующий ключ/решение отклоняется. Отказ SQL сохраняет прежнее состояние. - * Незавершённый rollback отключает модуль и запрашивает остановку ядра владельцем вне callback. */ + * Незавершённый rollback отключает модуль и запрашивает остановку ядра владельцем вне callback. + * Известное ограничение приёма REQUEST: вложенный SAVEPOINT допускает ACK/событие до commit внешней транзакции; + * её rollback теряет уже подтверждённый запрос. См. doc/chat_audit_findings.txt, «Аудит приёма REQUEST». */ #ifndef CHAT_ATTACHMENT_H #define CHAT_ATTACHMENT_H #include "../media_async/attachment.h"