[--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).
53 lines
1.9 KiB
Plaintext
53 lines
1.9 KiB
Plaintext
PUT: 3862953984/10737418240 bytes (736.8 MiB/s)
|
|
PUT: 7720665088/10737418240 bytes (736.2 MiB/s)
|
|
PUT: 10737418240/10737418240 bytes (724.1 MiB/s)
|
|
GET: 753926144/10737418240 bytes (143.6 MiB/s)
|
|
GET: 1443889152/10737418240 bytes (137.5 MiB/s)
|
|
GET: 2130706432/10737418240 bytes (135.3 MiB/s)
|
|
GET: 2915041280/10737418240 bytes (138.8 MiB/s)
|
|
GET: 3630170112/10737418240 bytes (138.3 MiB/s)
|
|
GET: 4347396096/10737418240 bytes (138.1 MiB/s)
|
|
GET: 5118099456/10737418240 bytes (139.3 MiB/s)
|
|
GET: 5929697280/10737418240 bytes (141.3 MiB/s)
|
|
GET: 6700400640/10737418240 bytes (141.9 MiB/s)
|
|
GET: 7456423936/10737418240 bytes (142.1 MiB/s)
|
|
GET: 8232370176/10737418240 bytes (142.6 MiB/s)
|
|
GET: 9137291264/10737418240 bytes (145.1 MiB/s)
|
|
GET: 10012852224/10737418240 bytes (146.8 MiB/s)
|
|
GET: 10737418240/10737418240 bytes (147.9 MiB/s)
|
|
{
|
|
"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
|
|
}
|