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

Commit

Permalink
Fix race in triggers
Browse files Browse the repository at this point in the history
  • Loading branch information
erikjohnston committed Jul 13, 2023
1 parent 20ae617 commit e60a7ea
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ BEGIN
INSERT INTO worker_read_write_locks_mode (lock_name, lock_key, write_lock, token)
VALUES (NEW.lock_name, NEW.lock_key, NEW.write_lock, NEW.token)
ON CONFLICT (lock_name, lock_key)
DO NOTHING;
DO UPDATE SET write_lock = NEW.write_lock, token = NEW.token;
RETURN NEW;
END
$$
Expand All @@ -131,11 +131,12 @@ BEGIN
SELECT token INTO new_token FROM worker_read_write_locks
WHERE
lock_name = OLD.lock_name
AND lock_key = OLD.lock_key;
AND lock_key = OLD.lock_key
LIMIT 1 FOR UPDATE;

IF NOT FOUND THEN
DELETE FROM worker_read_write_locks_mode
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key;
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key AND token = OLD.token;
ELSE
UPDATE worker_read_write_locks_mode
SET token = new_token
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ BEGIN
INSERT INTO worker_read_write_locks_mode (lock_name, lock_key, write_lock, token)
VALUES (NEW.lock_name, NEW.lock_key, NEW.write_lock, NEW.token)
ON CONFLICT (lock_name, lock_key)
DO NOTHING;
DO UPDATE SET write_lock = NEW.write_lock, token = NEW.token;
END;

-- Ensure that we keep `worker_read_write_locks_mode` up to date whenever a lock
Expand All @@ -105,6 +105,7 @@ FOR EACH ROW
BEGIN
DELETE FROM worker_read_write_locks_mode
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key
AND token = OLD.token
AND NOT EXISTS (
SELECT 1 FROM worker_read_write_locks
WHERE lock_name = OLD.lock_name AND lock_key = OLD.lock_key
Expand Down

0 comments on commit e60a7ea

Please sign in to comment.