v1.2.23: lock_check three-state return (True/False/None), None→503 DB unavailable

This commit is contained in:
2026-07-31 18:22:58 +04:00
parent 23688da90a
commit c1e7c4f9aa
3 changed files with 9 additions and 6 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ from routes.api_scenario_defs import bp_defs as api_scenario_defs_bp
# Версия — показывается в топбаре UI. Меняется при КАЖДОМ изменении кода. # Версия — показывается в топбаре UI. Меняется при КАЖДОМ изменении кода.
# Нужна для фильтрации истории (пользователь видит только записи своей версии). # Нужна для фильтрации истории (пользователь видит только записи своей версии).
VERSION = "1.2.22" VERSION = "1.2.23"
# Flask-приложение с Jinja2-шаблонами из папки templates/ # Flask-приложение с Jinja2-шаблонами из папки templates/
app = Flask(__name__, template_folder="templates", static_folder="static") app = Flask(__name__, template_folder="templates", static_folder="static")
+4 -4
View File
@@ -215,10 +215,11 @@ def lock_check(client_id, stand):
Returns: Returns:
True — можно запускать (нет RUNNING в БД) True — можно запускать (нет RUNNING в БД)
False — нельзя (уже есть RUNNING) → 409 Conflict""" False — нельзя (уже есть RUNNING) → 409 Conflict
None — БД недоступна, нельзя проверить → 503 DB unavailable"""
conn = get_conn() conn = get_conn()
if not conn: if not conn:
return False # без БД — не разрешаем (partial unique index недоступен) return None # БД недоступна — не True и не False, вызывающий решит
try: try:
cur = conn.cursor() cur = conn.cursor()
cur.execute(""" cur.execute("""
@@ -231,7 +232,6 @@ def lock_check(client_id, stand):
return row is None # None = нет RUNNING = можно запускать return row is None # None = нет RUNNING = можно запускать
except Exception as e: except Exception as e:
print(f"[DEFS] lock_check error: {e}", flush=True) print(f"[DEFS] lock_check error: {e}", flush=True)
# При ошибке БД — НЕ разрешаем (безопасный fallback) return None # ошибка БД — не можем проверить
return False
finally: finally:
put_conn(conn) put_conn(conn)
+4 -1
View File
@@ -41,7 +41,10 @@ def api_scenario_run():
cid = get_client_id() cid = get_client_id()
stand = get_stand() stand = get_stand()
if not lock_check(cid, stand): can_run = lock_check(cid, stand)
if can_run is None:
return jsonify({"error": "DB unavailable"}), 503
if not can_run:
return jsonify({"error": "Another scenario is already running"}), 409 return jsonify({"error": "Another scenario is already running"}), 409
defn = get_definition(def_id, cid, stand) defn = get_definition(def_id, cid, stand)