aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/info_request.rb
diff options
context:
space:
mode:
authorLouise Crow <louise.crow@gmail.com>2013-04-24 11:12:54 +0100
committerLouise Crow <louise.crow@gmail.com>2013-04-24 11:12:54 +0100
commita5975915975f5f2b815ec1a20e3bcfaf78831add (patch)
treed09d671e79ae1d3e31cd9234ce835df33c2bd5ea /app/models/info_request.rb
parenta244afcb7b7185905a7a16b37ae585e239e963ea (diff)
parentd3aae5cc48c92473e06b2104bb9431305d5a92f0 (diff)
Merge branch 'release/0.9' into wdtk
Diffstat (limited to 'app/models/info_request.rb')
-rw-r--r--app/models/info_request.rb11
1 files changed, 11 insertions, 0 deletions
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index 237364f56..eaed25a61 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -474,6 +474,17 @@ public
incoming_message = IncomingMessage.new
ActiveRecord::Base.transaction do
+
+ # To avoid a deadlock when simultaneously dealing with two
+ # incoming emails that refer to the same InfoRequest, we
+ # lock the row for update. In Rails 3.2.0 and later this
+ # can be done with info_request.with_lock or
+ # info_request.lock!, but upgrading to that version of
+ # Rails creates many other problems at the moment. In the
+ # interim, just use raw SQL to do the SELECT ... FOR UPDATE
+ raw_sql = "SELECT * FROM info_requests WHERE id = #{self.id} LIMIT 1 FOR UPDATE"
+ ActiveRecord::Base.connection.execute(raw_sql)
+
raw_email = RawEmail.new
incoming_message.raw_email = raw_email
incoming_message.info_request = self