mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-10 12:16:49 +00:00
fix(instances): two owners added at once keep a VM to one owner
With one owner per VM, the VM page and a user's page counted the VM's owners and then added one in separate steps, so two owners added at the same moment both found the VM without one, and it got two. The check and the insert now run in one transaction that holds the ownership lock (PostgreSQL's advisory lock; SQLite's IMMEDIATE transactions already serialize them): the second waits for the first and is refused. The audit row is written after the transaction, so a failure keeps its row.
This commit is contained in:
parent
5e93920d78
commit
cd2dd517b7
4 changed files with 107 additions and 19 deletions
|
|
@ -53,7 +53,8 @@ OWNERSHIP_LOCK = 0x7776635F6F776E
|
|||
def lock_ownership():
|
||||
"""Hold the ownership step of every compute until this transaction ends:
|
||||
a bury and a restore of the same UUID on two computes must not see each
|
||||
other's work half done. SQLite's IMMEDIATE transactions already do this."""
|
||||
other's work half done, nor two owners added at once each other's check.
|
||||
SQLite's IMMEDIATE transactions already do this."""
|
||||
if connection.vendor == "postgresql":
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute("SELECT pg_advisory_xact_lock(%s)", [OWNERSHIP_LOCK])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue