Document the 'archive redo baseline changed in place' failure, the runtime
session isolation, the offline storage-checkpoint repair, and the Prosody
native-format comparison (list_append in-place vs list_store atomic rename).
commit
(включая fsync/append). fsync одного канала задерживал SM-коммиты всех
остальных
сессий; при медленном диске и нескольких пользователях это выглядело как
«сервер
перестал отвечать на запросы» и секундная доставка сообщений.
- Глобальная блокировка разделена: короткий lock `slots` теперь только
валидирует token/limits и резервирует слот; сам append+fsync идёт под
per-session `wal` lock. Один медленный канал больше не блокирует
остальных.
- Ротация/compaction/GC сериализуются отдельным `maintenance` lock вне
любого
per-session lock — очереди append и compaction для одного WAL не
гонки,
дедлоков нет, инварианты durable и crash-тесты сохранены.
- Все существующие crash/latency/recovery regressions зелёные без
изменений.
Для genuinely медленного диска (VPS с медленным fsync) добавлена опция
как в
Prosody, где исходящие SM-stanza живого клиента идут в in-memory smqueue
без
fsync, а durable пишутся счётчик/h и переход в hibernation.
- `smacks_online_durable = false` (strict — default): live-сессии не
fsync на
каждый outbound/ack, а помечают `dirty`; фоновый проход
`smacks_flush_interval` (default1с) и offline-переход фиксируют
durable.
- Offline/hibernating цели в любом режиме фиксируются durable ДО
доставки —
сохраняются критичные инварианты («Alice отправила, Bob ещё не
авторизован»)
и crash-регрессии; отзыв токенов/expiry остаётся durable.
- Pre-ACK durable гарантию даёт строгий режим; deferred — компромисс
Prosody
«низкая задержка» в обмен на ограниченное окно потери для
online-пиров.
- `cargo test --locked --release`: 54 binary, 336 passed, 11 ignored (0
fail).
- Strict crash (`slow_storage_crash_network`), latency
(`slow_storage_latency`),
`sm_restart`, `journal_recovery_sync`, личная доставка — все зелёные.
- Новые регрессии: `tests/deferred_sm_online_network.py` (wire, deferred
режим:
offline durable до ACK, online доставка + flush persist), два Rust
unit-теста
в `tests/sm_journal.rs` (deferred online commit/flush, offline
durable).
- `push_latency_network.py` в этой среде падает на TLS CA `keyUsage`
из-за более
строгого TLS в Python 3.14 (до SM-кода, не связано с этим изменением).
Документация: [docs/DURABLE-MESSAGE-IO.md](docs/DURABLE-MESSAGE-IO.md),
[docs/COMPATIBILITY.md](docs/COMPATIBILITY.md).
MAM
append использует один sync вместо четырёх, SM checkpoint — один
вместо двух.
Checksummed redo journals сохраняют commit-before-ACK и
восстанавливают
native archive/SM JSON exports после аварии.
- Ограничены рост журналов, ротация и tombstone GC. Старый `.rappend` и
legacy
JSON импортируются. Retain/save/purge не возвращают удалённые записи.
- Recovery синхронизирует валидный journal перед публикацией состояния;
проверка
checksum не заменяет durability barrier. EIO при adoption блокирует
startup
или offline handoff. Новые fault fixtures проверяют сохранность
журнала и retry.
- Replay SM проверяет checksum/JSON всех frames, но создаёт и валидирует
полный
Record только для последнего snapshot, сокращая работу с superseded
queues.
- `message-processing-slow` содержит времена MAM отправителя/получателя,
доставки, carbons, offline/push и handled, а также число
ресурсов/копий.
Payload и секреты не добавляются в логи.
- Добавлена offline команда `storage-checkpoint CONFIG`: durable экспорт
и
передача archive writer/подготовка отката на legacy Rust. Не
запускайте другого
writer и не удаляйте journals до успешного завершения команды.
- Новые crash, partial-write, corruption, EIO, recovery, handoff и
latency
регрессии включены в GitHub Actions через verify-local.sh; отчёты
сохраняются.
Измерения, ограничения и эксплуатация:
[docs/DURABLE-MESSAGE-IO.md](docs/DURABLE-MESSAGE-IO.md),
[docs/VALIDATION-0.8.3.md](docs/VALIDATION-0.8.3.md).
сообщения
больше не выполняется полный scan/rewrite архива для expiry. Очистка
остаётся
в maintenance и перед MAM-запросами; append и crash checkpoint до
fanout сохранены.
- Неизменённые native config/persistent index не перезаписываются при
каждом
сообщении. Удалённые файлы восстанавливаются, ошибки экспорта
повторяются.
- CSI больше не сохраняет SM snapshot при отсутствии изменения durable
очереди.
Изменённая очередь сохраняется до отправки; при ошибке записи очередь
откатывается.
- Личные сообщения, IQ и входящая федерация к аккаунтам больше не
захватывают
общий MUC mutex, ожидая несвязанную работу с комнатными архивами.
- Добавлены регрессии native exports/archive scanning/CSI rollback и
реальный
TLS latency check в verify-local.sh, автоматически включённый и в CI.
Измерения и границы подтверждения:
[docs/MESSAGE-LATENCY.md](docs/MESSAGE-LATENCY.md).
Результаты итогового прогона:
[docs/VALIDATION-0.8.1.md](docs/VALIDATION-0.8.1.md).
- Личные сообщения и SM ACK больше не ждут сетевую отправку push.
Уведомления
отправляются через очередь1024 с максимум8параллельных маршрутов;
worker
и его задачи отменяются при завершении serve. Ошибки очереди/маршрута
логируются.
- Offline сообщение сохраняется до публикации push, чтобы проснувшийся
клиент
мог сразу получить его. Подтверждена очередь при первом TLS stream
push gateway.
- По умолчанию CSI считает важными bodyless OMEMO legacy/2, delivery
receipts
и chat markers. Явный список `csi_important_payloads` заменяет
расширенные defaults.
Низкоприоритетный headline по-прежнему буферизуется. Policy
обновляется и при SM resume.
- Выбор адресатов и carbons фильтрует владельцев до захвата session
mutex;
зависшая сессия чужого аккаунта не задерживает этот путь. Duplicate SM
ACK
без изменения durable counters/queue не переписывает snapshot.
- Bind2 и MAM metadata IQ читают только первый/последний native record
вместо
сканирования всей истории. Индекс не требуется; recovery/лимиты записи
сохранены.
- Добавлен `message-processing-slow`: обработка message дольше250мс,
поля
duration_ms/route, без payload/токенов. Это время обработки сервером,
не peer receipt.
- Новые сетевые регрессии включены в verify-local.sh/GitHub CI.
Причины, изменение CSI policy, измерения и ограничения:
[docs/PERSONAL-MESSAGE-LATENCY.md](docs/PERSONAL-MESSAGE-LATENCY.md).
ролей,
членства и ограниченной истории без MAM. Изменение фиксируется до
публикации
ответа; при ошибке записи состояние комнаты откатывается.
- Crash recovery использует последнее сохранённое поколение после
SIGKILL,
включая временные комнаты. Heartbeat обновляет живое членство;
ожидающие записи сохраняют исходный deadline через повторные
перезапуски.
`muc_recovery_grace_period`: по умолчанию 300 секунд, пределы
1..604800.
- Подтверждённые выходы, смена nick, ролей и политик комнаты не
заменяются
старой записью восстановления. Native config/state остаются экспортом
для
Prosody; согласованное восстановление Rust использует собственный
sidecar.
- Исправлены MUC probe, неизвестные типы presence, вход без MUC `<x/>`,
ошибки
доставки и статус 333. Обычные presence extensions сохраняются в живом
обмене; поддельная MUC identity фильтруется. `subject` вместе с `body`
либо
`thread` не изменяет тему комнаты.
- Подключены `muc_max_rooms`, `restrict_room_creation`, политики
регистрации
и зарегистрированного nick, `muc_tombstone_expiry`; добавлены
встроенные
административные ad-hoc команды уничтожения комнат и изменения
affiliation.
- Hub сохраняет resumable XEP-0198 сессии, счётчики и очередь. Resume
после
перезапуска доступен на новом TLS/SASL-транспорте через legacy SASL и
SASL2.
Действующие приватные SM-записи восстанавливают логические сессии и
MUC
до открытия listeners: offline-доставка попадает в очередь,
синтетический
join и история повторно не отправляются. SM resume не требует
дополнительной
available presence; без SM восстановление MUC требует новой
аутентификации
точного полного JID и available presence либо явного MUC-входа.
Входящий handled-счётчик обновляется после обработки. Сокеты TCP/TLS
не сохраняются; неопределённая сетевая отправка допускает повторную
доставку.
- Известные встроенные MUC-возможности Prosody отображаются на
Rust-реализацию.
Произвольные Lua/community-модули не исполняются; неизвестные явно
включённые
MUC-модули отклоняются при запуске. Общие и host `modules_disabled`
учитываются
для vCard и occupant-id.
Порядок восстановления, ограничения хранения и отката на Prosody:
[docs/MUC-RECOVERY.md](docs/MUC-RECOVERY.md).
Проверка: 293 Rust tests, Clippy/fmt/release, полный сетевой прогон, 500
TLS
MUC+SM ресурсов с SIGKILL/resume и native reference — успешно.
Подробности: [docs/VALIDATION-0.8.0.md](docs/VALIDATION-0.8.0.md).
[--execute]`: dry run по умолчанию, local ↔ S3 и S3 ↔ S3 без удаления
source.
- Последовательное копирование с проверкой размера и полным SHA-256
readback
destination; конфликтующий объект не перезаписывается. Временный диск
—
максимум один переносимый файл дополнительно к постоянному
destination.
- Durable migration journal позволяет продолжить прерванную операцию с
теми
же конфигурациями. Незавершённый или повреждённый journal блокирует
startup;
backend identity меняется только после проверки всех файлов.
- Native `uploads`/`upload_stats`, slots и JWT сохраняются;
поддерживаются
native локальные файлы без Rust completion sidecar. Миграция требует
остановки RustXMPP и Prosody, использующих общий `data_path`.
- Multipart intent сохраняется до создания удалённого upload. Recovery
находит потерянный UploadId через paginated listing и очищает только
точный
key принадлежащего slot. При сохранных metadata cleanup не зависит от
lifecycle; lifecycle остаётся дополнительной защитой, а не гарантией.
- Перед completion сохраняется durable marker. Неопределённый результат
completion при отсутствии подтверждённого объекта помещает только этот
slot в quarantine: PUT 409, retention не удаляет его, maintenance
повторяет
сверку. Startup продолжается; сохраняется single-use семантика.
- Добавлены network regressions миграции и расширены проверки multipart
recovery, потерянных ответов, отмены запросов и конфликтов
destination.
Настройка, команды миграции, recovery и ограничения отката:
[docs/HTTP-UPLOAD.md](docs/HTTP-UPLOAD.md).
Команды, результаты и границы подтверждения, включая qualification
реального
object store и 10 GiB:
[docs/VALIDATION-0.7.9.md](docs/VALIDATION-0.7.9.md).
Итог: 265 тестов, нагрузка 500 TLS клиентов и native reference —
успешно.
Реальные 10 GiB через MinIO (описанный test adapter), 1280parts и полный
SHA-256
пройдены; подробности — [VALIDATION-0.7.9](docs/VALIDATION-0.7.9.md).