Record lost REQUEST after real acknowledgment and author rollback

This commit is contained in:
evgeny committed 2026-10-27 00:55:14 +01:00
1 parent 9f7ceb5815
commit 15ec41f2fd
2 files changed
+80

No files matched your search

+69
View File
@@ -787,3 +787,72 @@ gui-results,native-initial}.log;новая одиночная регрессия
Полный аудит attachment/chat остаётся частичным:REQUEST,создание исходящего запроса,
файловые completion/delete/recovery требуют отдельной дальнейшей сверки. Отметки[~]
внешнего чеклиста сохранены,отчёт туда не добавлялся. Windows/FreeBSD не проверялись.
Аудит приёма REQUEST — 27.10.2026, base ef8e8f2c
Продолжена сверка оставшихся операций chat_attachment:приём REQUEST и создание
исходящего запроса в ak_tick. В приёме подтверждён отдельный дефект границы commit.
ak_receive:578–595 использует SAVEPOINT attachment_request и RELEASE,затем отправляет
настоящий REQUEST_ACK и ATTACHMENT_KEYS_CHANGED. Внешняя транзакция не отклоняется;
RELEASE вложенного savepoint не фиксирует её. Локальный SELECT видит новый запрос,
а независимое readonly-соединение — ещё нет. Сетевое подтверждение уже не связано
с последующим commit/rollback внешнего владельца.
Временный /tmp/attachment-request-audit.c включает текущий штатный
tests/test_encrypted_attachment.c с переименованным main. Все четыре ядра,SQLite,
публикация/скачивание контейнера,подписи мемберов,маршруты и E2E control настоящие.
Сборка идёт через tests/Makefile и дополнительный /tmp/attachment-request-audit.mk,
с текущей libutun и штатным test_clock. Исходники проекта не менялись.
В outer-режиме wrapper sqlite3_exec один раз открывает внешнюю BEGIN IMMEDIATE
непосредственно перед первым SAVEPOINT входящего REQUEST на авторе A.
Wrapper отправки наблюдает первый настоящий REQUEST_ACK,читает writer/reader
и передаёт неизменённые байты в прежний штатный wrapper,затем в настоящий router.
Флаги SIGNED|ENCRYPTED,channel/message_id и адресат проверяются. После вызова
настоящего события внешний владелец выполняет ROLLBACK. Это штатные успешные SQL
BEGIN/ROLLBACK,без подмены кодов ошибок,ключей,подписей,маршрутов или доставки.
На первом ACK фактическим получателем стал C (M,index3).
В точке ACK:autocommit0,writer_requests1,committed_requests0;router принимает ACK с rc0.
В точке события остаются те же значения. После ROLLBACK committed_requests0.
Получатель действительно принимает ACK через сеть:его state1 сохраняется собственной
проверенной транзакцией,REQUEST удаляется из outbox. Это не только факт вызова send:
следующее независимое чтение подтверждает committed состояние получателя.
Через6 секунд тестового времени:author_requests0,recipient_state1,outbox0,key_bytes0,
оба направления маршрута живы,исходящий REQUEST был отправлен ровно один раз.
После настоящего restart A и ещё6 секунд значения те же:повтора нет,у автора нет
запроса для решения. Фикстура остаётся phase5,поскольку автор получил только второй
запрос,а первый потерял после ACK. Внешний reader во всех проверках открывается
отдельным readonly-соединением и закрывается после завершённого чтения.
Ускоренные часы — стандартный test_clock с реальным I/O;phase/timers не подменялись.
Control использует тот же стенд без внешней транзакции:в ACK и событии autocommit1,
writer_requests1 и committed_requests1. Полный штатный сценарий достигает phase10,
включая уже исправленные отказы автора,его restart/повтор,отказ bind GRANT у получателя,
настоящий повтор GRANT,расшифровку,restart B и cache restore.
Control:exit0,ACK1,event1,defects0,allocations0→0.
Outer:ожидаемый exit1/phase5,BEGIN1,ACK1,event1,rollback1,два наблюдения до/после restart,
defects1,allocations0→0. Все подробные отрицательные логи прочитаны целиком.
Сборка:/tmp/attachment-request-audit-build.log (предупреждения snprintf штатной фикстуры).
Control:/tmp/attachment-request-audit-control.log,
полный /tmp/utun_encrypted_attachment_Ea1Vr0/test.log,строки110–112 и238.
Outer:/tmp/attachment-request-audit-outer.log,
полный /tmp/utun_encrypted_attachment_Knf0qh/test.log:BEGIN/ACK/event/rollback иоба WATCH.
Исправление должно дать приёму REQUEST собственную короткую транзакцию с отказом
внутри внешней транзакции без её изменения. Проверки допуска,вставки/чтения запроса,
повтора прежнего GRANT/DENY и завершения SQL должны предшествовать проверенному commit;
ACK/событие — после него. Нулевой INSERT при существующем запросе допустим для
дубликата,поэтому важно проверять сохранённые направление/состояние,а не требовать
одну новую строку при каждом повторе. Откат должен использовать общий ak_rollback
и принятый порядок quiesce/stop при незавершённой транзакции. Постоянные регрессии
должны проверить reader в ACK,отказ внешней транзакции,SQL-ошибки,дубликаты и повтор
после restart без потери запроса. Создание исходящего запроса этим не закрывается.
Открыта задача в doc/tasks.md;в .h и encrypted_attachments.md описано ограничение.
Менялись только комментарии и документация. Прежние исправления подготовки,приёма
результатов и решения автора сохранены. Runtime/wire/схема/штатные тесты не менялись;
новые fullcheck/sanitizers/GUI/APK не запускались. Чеклист остаётся без новых отчётов,
частичные отметки attachment/chat[~] сохранены. По AGENTS.md:10 дальнейший аудит остановлен.
+11
View File
@@ -4,6 +4,17 @@
## Текущие задачи
[ ] **chat_attachment: подтверждать входящий REQUEST после собственного commit** — подтверждено27.10.2026.
ak_receive использует SAVEPOINT attachment_request;во внешней транзакции RELEASE не выполняет commit.
Реальные ACK/событие отправляются при writer request1/readonly request0;внешний rollback теряет запрос автора.
Получатель уже сохранил state1 и удалил REQUEST outbox;нет повторов,ключ отсутствует и после restart автора при живых маршрутах.
Текущая A–S–B/C-фикстура:control phase10 PASS,outer phase5 ожидаемо FAIL;allocations0->0 в обоих сценариях.
Требуется собственная транзакция приёма,отказ внутри внешней транзакции без её изменения,проверенные SQL-этапы,
ACK/событие после commit и общий безопасный rollback. Дубликаты обязаны сохранять прежнее решение/повтор ответа.
Нужны постоянные проверки независимого reader в точке ACK,внешней транзакции,SQL-отказов и реального повтора/restart.
Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Аудит приёма REQUEST»;/tmp/attachment-request-audit-*.
Runtime не изменён;дальнейший аудит остановлен по AGENTS.md:10,отметки attachment/chat остаются[~].
[+] **chat_attachment: фиксировать решение автора вместе с исходящим ответом до успеха/UI** — исправлено27.10.2026.
Собственная BEGIN IMMEDIATE/COMMIT включает проверку прав,state и outbox;внешняя транзакция остаётся нетронутой.
ak_queue проверяет все SQL-этапы и одну строку,транзакцией владеет вызывающий;допуск автора проверяет finalize.