Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit e60a7ea

Browse files
committed
Fix race in triggers
1 parent 20ae617 commit e60a7ea

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

synapse/storage/schema/main/delta/78/04_read_write_locks_triggers.sql.postgres

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ BEGIN
108108
INSERT INTO worker_read_write_locks_mode (lock_name, lock_key, write_lock, token)
109109
VALUES (NEW.lock_name, NEW.lock_key, NEW.write_lock, NEW.token)
110110
ON CONFLICT (lock_name, lock_key)
111-
DO NOTHING;
111+
DO UPDATE SET write_lock = NEW.write_lock, token = NEW.token;
112112
RETURN NEW;
113113
END
114114
$$
@@ -131,11 +131,12 @@ BEGIN
131131
SELECT token INTO new_token FROM worker_read_write_locks
132132
WHERE
133133
lock_name = OLD.lock_name
134-
AND lock_key = OLD.lock_key;
134+
AND lock_key = OLD.lock_key
135+
LIMIT 1 FOR UPDATE;
135136

136137
IF NOT FOUND THEN
137138
DELETE FROM worker_read_write_locks_mode
138-
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key;
139+
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key AND token = OLD.token;
139140
ELSE
140141
UPDATE worker_read_write_locks_mode
141142
SET token = new_token

synapse/storage/schema/main/delta/78/04_read_write_locks_triggers.sql.sqlite

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ BEGIN
9191
INSERT INTO worker_read_write_locks_mode (lock_name, lock_key, write_lock, token)
9292
VALUES (NEW.lock_name, NEW.lock_key, NEW.write_lock, NEW.token)
9393
ON CONFLICT (lock_name, lock_key)
94-
DO NOTHING;
94+
DO UPDATE SET write_lock = NEW.write_lock, token = NEW.token;
9595
END;
9696

9797
-- Ensure that we keep `worker_read_write_locks_mode` up to date whenever a lock
@@ -105,6 +105,7 @@ FOR EACH ROW
105105
BEGIN
106106
DELETE FROM worker_read_write_locks_mode
107107
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key
108+
AND token = OLD.token
108109
AND NOT EXISTS (
109110
SELECT 1 FROM worker_read_write_locks
110111
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key

0 commit comments

Comments
 (0)