Record lost REQUEST after real acknowledgment and author rollback
This commit is contained in:
1 parent
9f7ceb5815
commit
15ec41f2fd
2 files changed
+80
No files matched your search
@@ -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 дальнейший аудит остановлен.
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user