From 0b5fe411a0a5eaf8c35e33501fc4ef12ad9f6837 Mon Sep 17 00:00:00 2001 From: James Osborne Date: Thu, 11 Jun 2026 09:52:42 -0400 Subject: [PATCH] Fix draining account lock reaper recursion --- backend/app.py | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/backend/app.py b/backend/app.py index aae961a..faa63e7 100644 --- a/backend/app.py +++ b/backend/app.py @@ -918,13 +918,49 @@ def newserv_account_lock_session_end(): + def reap_draining_account_locks(): - reaped, kept = reap_draining_account_locks() + reaped = [] + kept = [] + + with connect() as conn: + with conn.transaction(): + with conn.cursor(row_factory=psycopg.rows.dict_row) as cur: + cur.execute(""" + SELECT account_id, holder_source, source_region, source_ship, + account_store, state, sessions, created_at, updated_at, expires_at + FROM account_session_locks + WHERE state = 'draining' + ORDER BY updated_at ASC + FOR UPDATE + """) + rows = list(cur.fetchall()) + + for row in rows: + account_id = row["account_id"] + current, sync = account_sync_current_on_all_regions(account_id) + + if current: + cur.execute(""" + DELETE FROM account_session_locks + WHERE account_id = %s + """, (account_id,)) + reaped.append({ + "account_id": account_id_str(account_id), + "holder_source": row["holder_source"], + "sync_status": sync.get("status"), + }) + else: + kept.append({ + "account_id": account_id_str(account_id), + "holder_source": row["holder_source"], + "sync_status": sync.get("status"), + "regions": sync.get("regions"), + }) return reaped, kept - @app.post("/api/newserv/account-locks/reap-draining") def newserv_account_lock_reap_draining(): auth_error = require_newserv_shared_secret()