fix: атомарный dequeue, двойной ATI, MAX_RETRIES 620ms, ретеншн, фильтр device_id

This commit is contained in:
Repinoid
2026-06-28 11:46:00 +04:00
parent c33bd8e2de
commit 25c8eb20b9
3 changed files with 112 additions and 5 deletions
+14 -5
View File
@@ -192,11 +192,13 @@ def raw_dequeue_cmd():
).fetchone()
if not row:
return "", 204
db.conn.execute(
"UPDATE command_queue SET status='sent', sent_at=datetime('now') WHERE id=?",
cur = db.conn.execute(
"UPDATE command_queue SET status='sent', sent_at=datetime('now') WHERE id=? AND status='pending'",
(row["id"],)
)
db.conn.commit()
if cur.rowcount == 0: # перехватил другой воркер
return "", 204
result = {"seq": row["seq"], "cmd": row["cmd"], "timeout_ms": row["timeout_ms"], "drain_first": bool(row["drain_first"])}
logger.info(f"RawELM: dequeued #{row['seq']}{row['cmd']}")
return jsonify(result)
@@ -257,15 +259,22 @@ def raw_get_response():
@bp.route("/api/v1/elm/raw/status", methods=["GET"])
def raw_status():
"""Copilot: статус устройства."""
device_id = request.args.get("device_id", "unknown")
with Database() as db:
# Чистка старых записей (старше 1 дня)
db.conn.execute(
"DELETE FROM command_queue WHERE responded_at < datetime('now', '-1 day')"
)
db.conn.commit()
last = db.conn.execute(
"SELECT seq, status FROM command_queue ORDER BY id DESC LIMIT 1"
"SELECT seq, status FROM command_queue WHERE device_id=? ORDER BY id DESC LIMIT 1",
(device_id,)
).fetchone()
pending = db.conn.execute(
"SELECT COUNT(*) FROM command_queue WHERE status='pending'"
"SELECT COUNT(*) FROM command_queue WHERE device_id=? AND status='pending'", (device_id,)
).fetchone()[0]
total = db.conn.execute(
"SELECT COUNT(*) FROM command_queue WHERE status='done'"
"SELECT COUNT(*) FROM command_queue WHERE device_id=? AND status='done'", (device_id,)
).fetchone()[0]
return jsonify({
"device_ready": last is not None,