Describe committed author decisions and rollback lifecycle

This commit is contained in:
evgeny committed 2026-10-27 00:39:18 +01:00
1 parent 401193950b
commit 7649981cbc
2 files changed
+23 -9

No files matched your search

+22 -8
View File
@@ -137,14 +137,16 @@ REQUEST=1, REQUEST_ACK=2, GRANT=3, DENY=4, RESULT_ACK=5
контейнера. Конфликтующие ключи и результаты отклоняются.
REQUEST_ACK отправляется после сохранения запроса. GRANT/DENY появляются
в outbox при сохранении решения. В этой авторской операции обнаружен отдельный дефект:
`chat_attachment_decide` проверяет изменение состояния, но не число строк записи outbox.
Пропуск INSERT через `RAISE(IGNORE)` даёт успех и событие UI с решением без GRANT в очереди;
получатель после REQUEST_ACK уже не повторяет запрос, перезапуск автора очередь не восстанавливает.
Кроме того, SAVEPOINT внутри внешней транзакции даёт успех и событие до её commit;
внешний rollback затем отменяет решение и исходящий ответ. Оба случая воспроизведены на
локальной сети A–S–B/C; исправление этой операции ещё не выполнено.
Доказательства и границы проверки — в [chat_audit_findings.txt](chat_audit_findings.txt), «Аудит решения автора».
в outbox в одной собственной BEGIN IMMEDIATE/COMMIT с решением автора. Проверка прав
также выполняется внутри неё. Изменяется ровно один входящий запрос в state=0;
уже принятое решение повторной командой не заменяется. Общий помощник записи outbox
проверяет prepare, все bind, step, ровно одну строку и finalize, транзакцией управляет вызывающий.
Внешняя транзакция отклоняется до проверки прав и остаётся нетронутой. SQL-отказ,
включая пропуск записи через RAISE(IGNORE), сохраняет прежние состояние и очередь.
Возврат0 и единственное уведомление UI следуют после проверенного commit; доставка
выполняется позже. Trampoline при ошибке отправляет событие с success=0, позволяя повторить команду.
Неудачный rollback с открытой транзакцией отключает модуль и запрашивает stop ядра после poll.
История дефекта и исправления — в [chat_audit_findings.txt](chat_audit_findings.txt).
Ответы REQUEST_ACK/GRANT/DENY/RESULT_ACK
применяются собственной короткой транзакцией: чтение запроса и очереди, запись ключа
@@ -187,10 +189,22 @@ backpressure и повтором через 5 секунд; restart продол
Дополнительно проверяются настоящий commit veto, INSERT ABORT/IGNORE, внешняя транзакция,
синхронный отказ запуска, restart с опубликованным ключом и отказ rollback с закрытием БД владельцем.
`test_attachment_decisions` проверяет116 SQL-отказов/повторов выдачи и отказа, с пустой
и существующей очередью: чтение подписанного мембера, допуск автора, запись состояния,
outbox, BEGIN/COMMIT. Участник имеет настоящие join/invitation подписи, сообщение
сохранено штатным chat_core; запись локального вложения создаётся фикстурой.
Readonly-соединение в событии проверяет committed ключ/состояние/команду/retry_at/created_at
и сохранность соседнего ключа. Дополнительно: настоящий commit veto, ABORT/IGNORE для
UPDATE состояния и INSERT/UPDATE очереди, внешняя транзакция, удалённый мембер,
неверное направление и повторное решение, один GUI event, остановка при отказе rollback.
`test_encrypted_attachment`: реальные A–S–B/C, скачивание с S при выключенном A,
перезапуски автора с запросами и получателя с ключом, выдача B и отказ C,
отсутствие ключа на S/C, отрицательные control-пакеты, повтор GRANT,
восстановление удалённого plaintext без нового согласия и удаление канала.
На Linux пропуск GRANT outbox и внешняя транзакция автора отвергаются без изменения
ожидающего запроса и без события. После restart автора повтор решения сохраняет
state+outbox; отдельное readonly-соединение подтверждает их в момент единственного события UI.
На Linux первый bind полученного GRANT намеренно возвращает SQLITE_NOMEM: проверяются
полный откат и отсутствие ACK, сохранение GRANT у автора, затем реальная повторная выдача
и расшифровка. Перед каждым RESULT_ACK получателя отдельное readonly-соединение видит ключ.
+1 -1
View File
@@ -37,7 +37,7 @@ Desktop и Android проверяют `instance->running` вместе со св
включая Android-цикл после restart. Запрос из callback завершает цикл после возврата
из текущего poll; уже начатая обработка остальных callbacks этого poll не прерывается.
Владелец затем снимает media-привязки, уничтожает ядро и освобождает uasync.
Это используется также при отказе rollback авторской подготовки вложения или применения ответа о ключе, если SQL-транзакция
Это используется также при отказе rollback подготовки вложения, решения автора или применения ответа о ключе, если SQL-транзакция
осталась открыта: модуль вложений предварительно прекращает приём и снимает свой таймер/router.
Create уже подготавливает listeners, топологию/SQLite, router/proxy и мониторинг;