[--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).
94 lines
2.9 KiB
JSON
94 lines
2.9 KiB
JSON
{
|
|
"version": "0.7.7",
|
|
"date_utc": "2026-10-20",
|
|
"ordinary_tests": {
|
|
"passed": 262,
|
|
"failed": 0,
|
|
"ignored": 11
|
|
},
|
|
"fmt": "passed",
|
|
"clippy": "passed",
|
|
"release": "passed",
|
|
"native_module_tests": 8,
|
|
"native_federation_tests": 1,
|
|
"http_altconnect": {
|
|
"native_reference": "supplied plugins/mod_http_altconnect.lua cafd74b9c5ea",
|
|
"unit_tests": 3,
|
|
"network_configurations": 10,
|
|
"checks": [
|
|
"HTTP and verified HTTPS XRD/JRD parity",
|
|
"MIME/CORS/GET/HEAD/OPTIONS and method405",
|
|
"query ignored, no JSONP",
|
|
"advertise_bosh/websocket combinations and loaded transport gates",
|
|
"discovery disabled while WSS still works",
|
|
"custom altconnect/BOSH/WS mounts and public URL prefix",
|
|
"local/global inheritance and HTTPS preference",
|
|
"HTTP native compatibility fallback",
|
|
"HTTP Host denial and overflowing port rejection",
|
|
"config type/path collision rejection"
|
|
],
|
|
"public_urls": "configuration only; no request Host/Forwarded interpolation",
|
|
"standard_caveat": "XEP0156 requires HTTPS metadata and HTTPS/WSS href; supplied-native HTTP/WS fallback retained and documented"
|
|
},
|
|
"load": {
|
|
"total_load_wall_seconds": 7.447,
|
|
"requested_resources": 500,
|
|
"authenticated_bound_resources": 500,
|
|
"connection_setup_concurrency": 50,
|
|
"setup_wall_seconds": 0.653,
|
|
"setup_latency": {
|
|
"samples": 500,
|
|
"median_ms": 57.419,
|
|
"p95_ms": 87.729,
|
|
"max_ms": 107.7
|
|
},
|
|
"ping_rounds": 10,
|
|
"ping_round_trip": {
|
|
"samples": 5000,
|
|
"median_ms": 14.618,
|
|
"p95_ms": 19.347,
|
|
"max_ms": 30.719
|
|
},
|
|
"accounts": 100,
|
|
"message_rounds": 10,
|
|
"messages_sent": 5000,
|
|
"messages_received": 5000,
|
|
"message_batch_seconds": 4.483,
|
|
"metrics_before": {
|
|
"rss_kib": 7792,
|
|
"cpu_seconds": 0.0,
|
|
"fd_count": 11
|
|
},
|
|
"metrics_connected": {
|
|
"rss_kib": 26488,
|
|
"cpu_seconds": 1.17,
|
|
"fd_count": 511
|
|
},
|
|
"metrics_after_workload": {
|
|
"rss_kib": 27100,
|
|
"cpu_seconds": 8.93,
|
|
"fd_count": 511
|
|
},
|
|
"metrics_two_seconds_after_disconnect": {
|
|
"rss_kib": 27228,
|
|
"cpu_seconds": 8.95,
|
|
"fd_count": 11
|
|
},
|
|
"sampled_peak_rss_kib": 27228,
|
|
"fd_delta_after_disconnect": 0,
|
|
"failures": [],
|
|
"scope": "One loopback host, 100 accounts with distinct resources, TLS+PLAIN, ping and directed messages; not a production benchmark or proof of no memory leaks.",
|
|
"mam": {
|
|
"archive_files": 100,
|
|
"records": 10000,
|
|
"expected_records": 10000
|
|
}
|
|
},
|
|
"release_binary_sha256": "4678c35c9ad53f2632f0f0245d842589a15dd4e02b9cb172f15dd7b035422294",
|
|
"limitations": [
|
|
"Real production proxy/discovery/client UI not run; operator must enable module and publish well-known on HTTPS domain",
|
|
"Exactly one runtime VirtualHost; no Host Meta2/XEP0487",
|
|
"Previous parity/PEP/DNSSEC limitations unchanged; COMPATIBILITY.md"
|
|
]
|
|
}
|