[--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).
36 lines
1.1 KiB
JSON
36 lines
1.1 KiB
JSON
{
|
|
"status": "passed",
|
|
"requested_bytes": 10737418240,
|
|
"python_chunk_bytes": 1048576,
|
|
"transport": "verified TLS HTTPS",
|
|
"storage": "local streaming file",
|
|
"rss_sample_interval_seconds": 0.05,
|
|
"free_disk_before_bytes": 14037065728,
|
|
"max_rss_bytes": {
|
|
"server": 18079744,
|
|
"client": 21168128
|
|
},
|
|
"rss_proc_status_paths": {
|
|
"server": "/proc/68012/status",
|
|
"client": "/proc/self/status"
|
|
},
|
|
"put_bytes": 10737418240,
|
|
"put_seconds": 14.389516601999276,
|
|
"sha256": "e4c296c41d3a9605f0348961e41ed835b5f42c220751ed2269a726951546c935",
|
|
"stored_bytes": 10737418240,
|
|
"allocated_bytes": 10737422336,
|
|
"free_disk_after_put_bytes": 2734645248,
|
|
"head_status": 200,
|
|
"get_bytes": 10737418240,
|
|
"get_read_calls": 10241,
|
|
"get_seconds": 69.22072244599985,
|
|
"get_sha256": "e4c296c41d3a9605f0348961e41ed835b5f42c220751ed2269a726951546c935",
|
|
"range_status": 206,
|
|
"range_offset": 4294967289,
|
|
"reuse_status": 409,
|
|
"over_quota_condition": "not-acceptable",
|
|
"temporary_files_cleaned": true,
|
|
"free_disk_after_cleanup_bytes": 12774170624,
|
|
"total_seconds": 84.19309745400096
|
|
}
|