Версия 0.8.3 удерживала глобальный Store.slots mutex на весь durable
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).
This commit is contained in:
1 parent
bff609097b
commit
821e1c3e2f
11 files changed
+656
-88
No files matched your search
@@ -71,15 +71,15 @@ in-place append при активном redo считается незаверш
|
||||
`message-processing-slow` по-прежнему имеет threshold 250 мс, duration_ms, route
|
||||
и connection. Новые поля в integer milliseconds:
|
||||
|
||||
|Поле|Измеряемый этап|
|
||||
|---|---|
|
||||
|pre_routing_ms|Работа до личного MAM; для MUC/ранних выходов — обработка до handled|
|
||||
|sender_mam_ms|Политика и архивирование отправителя|
|
||||
|recipient_mam_ms|Проверка аккаунта, политика и архивирование получателя|
|
||||
|delivery_ms|Маршрутизация, targets, mutex и transmit|
|
||||
|carbons_ms|Выбор ресурсов и отправка carbon|
|
||||
|offline_push_ms|Offline commit и подготовка/enqueue push|
|
||||
|handled_ms|Session mutex и durable mark_handled|
|
||||
| Поле | Измеряемый этап |
|
||||
| ---------------- | -------------------------------------------------------------------- |
|
||||
| pre_routing_ms | Работа до личного MAM; для MUC/ранних выходов — обработка до handled |
|
||||
| sender_mam_ms | Политика и архивирование отправителя |
|
||||
| recipient_mam_ms | Проверка аккаунта, политика и архивирование получателя |
|
||||
| delivery_ms | Маршрутизация, targets, mutex и transmit |
|
||||
| carbons_ms | Выбор ресурсов и отправка carbon |
|
||||
| offline_push_ms | Offline commit и подготовка/enqueue push |
|
||||
| handled_ms | Session mutex и durable mark_handled |
|
||||
|
||||
Неисполненные этапы равны 0. target_count — выбранные локальные ресурсы,
|
||||
carbon_count — успешные carbon transmit. Это серверные этапы, не время
|
||||
@@ -101,3 +101,25 @@ partial tails, corruption, ротацию, tombstones, migration и offline hand
|
||||
Медленный диск не становится быстрым от сокращения числа sync. Проверка на
|
||||
loopback не устанавливает причину каждого production warning; новые phase
|
||||
fields позволяют проверить это на целевой системе.
|
||||
|
||||
## 0.8.4: разблокировка и deferred online durability
|
||||
|
||||
Глобальный `Store.slots` mutex ранее удерживался на весь commit (включая fsync),
|
||||
так что fsync одной сессии блокировал durable-коммиты всех остальных — при
|
||||
медленном диске и нескольких пользователях это выглядело как «сервер перестал
|
||||
отвечать на запросы». Теперь речь накладывает короткий lock `slots` только на
|
||||
валидацию/резервирование, а сам append+fsync идёт под per-session `wal` lock.
|
||||
Ротация/compaction/GC сериализуются отдельным `maintenance` lock вне любого
|
||||
`sessions` `wal` lock — дедлоков нет и инварианты durable сохранены.
|
||||
|
||||
Для genuinely медленного диска добавлена Prosody-совместимая опция
|
||||
`smacks_online_durable = false` (strict — default). В режиме live-сессии с
|
||||
открытым transport не fsync на каждый outbound/ack, а помечают `dirty`;
|
||||
фоновый проход `smacks_flush_interval` (default1с) и offline-переход фиксируют
|
||||
состояние durable. Offline/hibernating цели фиксируются durable ДО доставки в
|
||||
любом режиме (сохранены crash-инварианты и регрессия Bob-online-не-авторизован).
|
||||
Резюме wire-проверки: strict crash/latency тесты зелёные; deferred прошел
|
||||
`tests/deferred_sm_online_network.py`; семантику store проверяют два новых Rust
|
||||
unit-теста в tests/sm_journal.rs. Полную durable-гарантию пред-ACK даёт строгий
|
||||
режим; deferred — это компромисс «максимальная совместимость с Prosody и
|
||||
низкая задержка» в обмен на ограниченное окно потери для online-пиров.
|
||||
Reference in new issue
Block a user