From 840de400859e85d62e635ead390848f2b75877e6 Mon Sep 17 00:00:00 2001 From: Brian Palmer Date: Thu, 10 May 2012 09:16:38 -0600 Subject: [PATCH] select for update in the postgresql job delete trigger we think this will avoid a deadlock condition where an insert takes the ShareRowExclusiveLock at the wrong moment and deadlocks us inside the trigger. test plan: not consistently reproducable without major postgresql instrumentation. ensure that jobs with a strand function as normal (running the specs is a good sanity check) Change-Id: Ib8c8ba972fd3c51ff116776213c936b9d7a48785 Reviewed-on: https://gerrit.instructure.com/10663 Reviewed-by: Zach Wily Tested-by: Jenkins --- ...0510004759_delayed_jobs_delete_trigger_lock_for_update.rb} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename db/migrate/{20120506140811_delayed_jobs_delete_trigger_revert_lock.rb => 20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb} (88%) diff --git a/db/migrate/20120506140811_delayed_jobs_delete_trigger_revert_lock.rb b/db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb similarity index 88% rename from db/migrate/20120506140811_delayed_jobs_delete_trigger_revert_lock.rb rename to db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb index a3c7924f0e5..a58afd9ca36 100644 --- a/db/migrate/20120506140811_delayed_jobs_delete_trigger_revert_lock.rb +++ b/db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb @@ -1,4 +1,4 @@ -class DelayedJobsDeleteTriggerRevertLock < ActiveRecord::Migration +class DelayedJobsDeleteTriggerLockForUpdate < ActiveRecord::Migration tag :predeploy def self.connection @@ -10,7 +10,7 @@ class DelayedJobsDeleteTriggerRevertLock < ActiveRecord::Migration execute(<<-CODE) CREATE OR REPLACE FUNCTION delayed_jobs_after_delete_row_tr_fn () RETURNS trigger AS $$ BEGIN - UPDATE delayed_jobs SET next_in_strand = 't' WHERE id = (SELECT id FROM delayed_jobs j2 WHERE j2.strand = OLD.strand ORDER BY j2.strand, j2.id ASC LIMIT 1); + UPDATE delayed_jobs SET next_in_strand = 't' WHERE id = (SELECT id FROM delayed_jobs j2 WHERE j2.strand = OLD.strand ORDER BY j2.strand, j2.id ASC LIMIT 1 FOR UPDATE); RETURN OLD; END; $$ LANGUAGE plpgsql;