feat: retry 3x + warmup health check for upload (Phase 2), bump 1.0.5→1.0.6
Deploy loadtest / validate (push) Waiting to run
Deploy loadtest / validate (push) Waiting to run
This commit is contained in:
+1
-1
@@ -4,7 +4,7 @@ from flask import Flask, render_template, request
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
VERSION = '1.0.5'
|
||||
VERSION = '1.0.6'
|
||||
|
||||
|
||||
@app.route('/')
|
||||
|
||||
+43
-1
@@ -130,6 +130,19 @@ function renderTable() {
|
||||
}
|
||||
}
|
||||
|
||||
/** warmup() — прогрев соединения перед загрузкой */
|
||||
function warmup() {
|
||||
return new Promise(function (resolve) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET', '/health');
|
||||
xhr.timeout = 3000;
|
||||
xhr.onload = function () { resolve(true); };
|
||||
xhr.onerror = function () { resolve(false); };
|
||||
xhr.ontimeout = function () { resolve(false); };
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
|
||||
/** uploadAll() — последовательная загрузка всех файлов */
|
||||
async function uploadAll() {
|
||||
if (uploading || files.length === 0) return;
|
||||
@@ -137,6 +150,9 @@ async function uploadAll() {
|
||||
uploadBtn.disabled = true;
|
||||
clearBtn.disabled = true;
|
||||
|
||||
// Прогрев соединения
|
||||
await warmup();
|
||||
|
||||
var totalBytes = 0;
|
||||
var totalElapsed = 0;
|
||||
var okCount = 0;
|
||||
@@ -151,7 +167,7 @@ async function uploadAll() {
|
||||
renderTable();
|
||||
|
||||
try {
|
||||
var result = await uploadOne(f, i);
|
||||
var result = await uploadOneWithRetry(f, i);
|
||||
f.status = 'ok';
|
||||
f.elapsed = result.elapsed_ms;
|
||||
f.speed = result.elapsed_ms > 0 ? Math.round(result.bytes / (result.elapsed_ms / 1000)) : null;
|
||||
@@ -180,6 +196,32 @@ async function uploadAll() {
|
||||
fileSummary.textContent = summary;
|
||||
}
|
||||
|
||||
/** uploadOneWithRetry(f, idx) — ретрай до 3 раз */
|
||||
function uploadOneWithRetry(f, idx) {
|
||||
var MAX_RETRIES = 3;
|
||||
var RETRY_DELAY = 500; // ms
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
var attempt = 0;
|
||||
|
||||
function tryUpload() {
|
||||
attempt++;
|
||||
uploadOne(f, idx).then(resolve).catch(function (e) {
|
||||
if (attempt < MAX_RETRIES) {
|
||||
f.progress = 0;
|
||||
f.status = 'uploading';
|
||||
renderTable();
|
||||
setTimeout(tryUpload, RETRY_DELAY);
|
||||
} else {
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
tryUpload();
|
||||
});
|
||||
}
|
||||
|
||||
/** uploadOne(fileEntry, idx) — читает файл в base64, отправляет как поле формы */
|
||||
function uploadOne(f, idx) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
Reference in New Issue
Block a user