Editing a scenario and saving (with or without changes) returned 500:
function pg_advisory_xact_lock(smallint, bigint) does not exist
Postgres only ships (int4, int4) and (bigint) variants. The two-arg call
passed `m = hash(uuid) & 0xFFFFFFFF` which can reach 2^32-1, so psycopg
promoted it to bigint and no overload matched.
Switched to the single-arg bigint form. While there, replaced Python's
built-in hash() with hashlib.blake2b(...) — the built-in is randomised
per process via PYTHONHASHSEED, so gunicorn workers were computing
different lock keys for the same scenario and the lock wasn't actually
serialising across workers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>