v0.0.72: ретраи pull (3 попытки), корректная ошибка лимита сессии, счётчик дедупа
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
+1
-1
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
|
||||
sys.path.insert(0, _sys_path_root)
|
||||
|
||||
# Версия приложения (меняется при изменениях)
|
||||
VERSION = "0.0.71"
|
||||
VERSION = "0.0.72"
|
||||
|
||||
|
||||
def setup_logging():
|
||||
|
||||
+31
-5
@@ -30,6 +30,10 @@ from session import (create_session, add_file, get_files, store_result,
|
||||
api_bp = Blueprint("api", __name__, url_prefix="/api")
|
||||
log = logging.getLogger("routes.api_bp")
|
||||
|
||||
# Ретраи pull из ВМ-буфера: защита от разовых DNS/сетевых сбоев (gaierror -5 и т.п.)
|
||||
PULL_RETRIES = 3
|
||||
PULL_RETRY_DELAY = 2 # секунды между попытками
|
||||
|
||||
|
||||
def _disconnect_exceptions():
|
||||
"""Исключения, означающие отключение клиента SSE."""
|
||||
@@ -105,9 +109,23 @@ def upload_refs():
|
||||
except Exception:
|
||||
pass
|
||||
continue
|
||||
with client.stream("GET", url) as resp:
|
||||
resp.raise_for_status()
|
||||
content = b"".join(resp.iter_bytes())
|
||||
# Pull с ретраями: разовые DNS/сетевые сбои не роняют всю загрузку
|
||||
content = None
|
||||
last_err = None
|
||||
for attempt in range(PULL_RETRIES):
|
||||
try:
|
||||
with client.stream("GET", url) as resp:
|
||||
resp.raise_for_status()
|
||||
content = b"".join(resp.iter_bytes())
|
||||
last_err = None
|
||||
break
|
||||
except Exception as e:
|
||||
last_err = e
|
||||
log.warning("upload_refs: pull attempt %d/%d failed sid=%s file=%r: %r",
|
||||
attempt + 1, PULL_RETRIES, sid, name, e)
|
||||
time.sleep(PULL_RETRY_DELAY)
|
||||
if content is None:
|
||||
raise last_err if last_err else RuntimeError("pull failed")
|
||||
log.info("upload_refs: pulled sid=%s file=%r size=%d", sid, name, len(content))
|
||||
if len(content) > MAX_FILE_BYTES:
|
||||
log.warning("upload_refs: pulled file exceeds %dMB, skip sid=%s file=%r size=%d",
|
||||
@@ -118,8 +136,16 @@ def upload_refs():
|
||||
pass
|
||||
continue
|
||||
if not add_file(sid, name, content):
|
||||
log.warning("upload_refs: session not found/limit, sid=%s file=%r", sid, name)
|
||||
return jsonify({"ok": False, "error": "Session not found"}), 404
|
||||
# Различить: сессия исчезла vs превышен суммарный лимит сессии
|
||||
if get_files(sid) is None:
|
||||
log.warning("upload_refs: session not found, sid=%s file=%r", sid, name)
|
||||
return jsonify({"ok": False, "error": "Session not found"}), 404
|
||||
log.warning("upload_refs: session limit exceeded, skip sid=%s file=%r", sid, name)
|
||||
try:
|
||||
client.delete(url)
|
||||
except Exception:
|
||||
pass
|
||||
continue
|
||||
try:
|
||||
client.delete(url) # убрать файл с ВМ после загрузки
|
||||
except Exception:
|
||||
|
||||
@@ -527,7 +527,7 @@ function addFileWithDedup(file) {
|
||||
const idx = sf.findIndex(f => f.name === name);
|
||||
if (idx >= 0) sf[idx] = new File([file], name, { lastModified: mtime });
|
||||
}
|
||||
return;
|
||||
return false; // дедуп: файл не добавлен (обновлена только дата)
|
||||
}
|
||||
// Имя то же, размер другой — добавить с суффиксом _2, _3...
|
||||
const dot = name.lastIndexOf('.');
|
||||
@@ -548,9 +548,10 @@ function addFileWithDedup(file) {
|
||||
if (over) {
|
||||
overNames.add(name);
|
||||
sf.push(new File([file], name, { lastModified: mtime }));
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
sf.push(new File([file], name, { lastModified: mtime }));
|
||||
return true;
|
||||
}
|
||||
|
||||
fi.addEventListener('change', async () => {
|
||||
@@ -613,21 +614,17 @@ folderInput.addEventListener('change', async () => {
|
||||
if (nested.length) {
|
||||
for (const nf of nested) {
|
||||
const nm = relDir ? relDir + '/' + nf.name : nf.name;
|
||||
addFileWithDedup(new File([nf], nm, { lastModified: nf.lastModified }));
|
||||
added++;
|
||||
if (addFileWithDedup(new File([nf], nm, { lastModified: nf.lastModified }))) added++;
|
||||
}
|
||||
} else {
|
||||
// в архиве нет документов — добавить архив как есть, чтобы не терялся
|
||||
addFileWithDedup(new File([f], rel, { lastModified: f.lastModified }));
|
||||
added++;
|
||||
if (addFileWithDedup(new File([f], rel, { lastModified: f.lastModified }))) added++;
|
||||
}
|
||||
} catch (err) {
|
||||
addFileWithDedup(new File([f], rel, { lastModified: f.lastModified })); // zip как есть
|
||||
added++;
|
||||
if (addFileWithDedup(new File([f], rel, { lastModified: f.lastModified }))) added++; // zip как есть
|
||||
}
|
||||
} else if (DOC_EXTS.some(e => low.endsWith(e))) {
|
||||
addFileWithDedup(new File([f], rel, { lastModified: f.lastModified }));
|
||||
added++;
|
||||
if (addFileWithDedup(new File([f], rel, { lastModified: f.lastModified }))) added++;
|
||||
}
|
||||
// иначе — не документ, пропускаем
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user