ролей, членства и ограниченной истории без 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).
89 lines
3.0 KiB
JSON
89 lines
3.0 KiB
JSON
{
|
|
"version": "0.8.0",
|
|
"date_utc": "2026-10-20",
|
|
"ordinary_tests": {
|
|
"passed": 293,
|
|
"failed": 0,
|
|
"ignored": 11
|
|
},
|
|
"fmt": "passed",
|
|
"clippy": "passed",
|
|
"release": "passed",
|
|
"release_binary_sha256": "74882319fcb467dd1e1813ab61e85441ffd3dae2f9f7961b28fd98ec5da7c89a",
|
|
"native_module_tests": 8,
|
|
"native_federation_tests": 1,
|
|
"muc_crash_network": "passed: real TLS, SIGKILL, temporary/persistent rooms, multiple resources, saved presence/roles, ordered history, acknowledged leave/kick/demotion/password/config, fixed grace, unsupported module rejection; destroy/tombstone separate log",
|
|
"sm_restart_network": "passed: SIGKILL/SIGTERM, legacy/SASL2, counter/replay/ack pruning, owner/token/h isolation, resource conflict, account deletion/recreation revocation, MUC offline fanout durable before recipient authentication",
|
|
"muc_sm_load": {
|
|
"clients": 500,
|
|
"accounts": 100,
|
|
"rooms": 10,
|
|
"message_rounds": 3,
|
|
"concurrency": 20,
|
|
"binary": "/tmp/xmpp-durable-muc-load-g0crm4ik/rust-xmpp",
|
|
"binary_sha256": "74882319fcb467dd1e1813ab61e85441ffd3dae2f9f7961b28fd98ec5da7c89a",
|
|
"before": {
|
|
"rss_kib": 9696,
|
|
"cpu_seconds": 0.0,
|
|
"fd_count": 12
|
|
},
|
|
"connect_seconds": 5.193,
|
|
"connect_latency": {
|
|
"samples": 500,
|
|
"median_ms": 204.391,
|
|
"p95_ms": 270.035,
|
|
"max_ms": 332.503
|
|
},
|
|
"phase": "completed",
|
|
"status": "pass",
|
|
"elapsed_seconds": 78.857,
|
|
"join_seconds": 46.703,
|
|
"joined": {
|
|
"rss_kib": 42248,
|
|
"cpu_seconds": 17.77,
|
|
"fd_count": 513
|
|
},
|
|
"join_presence_deliveries": 25000,
|
|
"slots_joined": {
|
|
"count": 500,
|
|
"bytes": 309790
|
|
},
|
|
"message_seconds": 10.861,
|
|
"room_messages_sent": 30,
|
|
"room_messages_delivered": 1500,
|
|
"before_kill": {
|
|
"rss_kib": 42128,
|
|
"cpu_seconds": 23.12,
|
|
"fd_count": 514
|
|
},
|
|
"slots_before_kill": {
|
|
"count": 500,
|
|
"bytes": 514030
|
|
},
|
|
"restart_seconds": 10.559,
|
|
"resumed_resources": 10,
|
|
"replayed_pending_room_messages": 10,
|
|
"membership_groupchat_deliveries_after_resume": 10,
|
|
"after_resume": {
|
|
"rss_kib": 21168,
|
|
"cpu_seconds": 5.03,
|
|
"fd_count": 23
|
|
},
|
|
"slots_after_resume": {
|
|
"count": 500,
|
|
"bytes": 671070
|
|
},
|
|
"total_seconds": 78.857,
|
|
"peak_rss_kib": 42252
|
|
},
|
|
"upload": "S3 fixture/migration/network regression passed; large 10GiB transfer retained as historical0.7.9 validation, not repeated0.8.0",
|
|
"limitations": [
|
|
"New TLS/SASL connection required; TCP/TLS sockets cannot survive process exit",
|
|
"At-least-once SM replay, not cross-store/network exactly-once transaction",
|
|
"Known builtin MUC features ported; arbitrary community Lua modules not executed",
|
|
"Private durable SM format is Rust-specific, bounded queues and component checkpoint; see MUC-RECOVERY.md",
|
|
"Loopback smoke tests, not production capacity or real client qualification",
|
|
"Full Prosody parity remains subject to COMPATIBILITY.md"
|
|
]
|
|
}
|