about summary refs log tree commit diff
path: root/app/models
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2019-03-06 19:53:57 +0100
committerEugen Rochko <eugen@zeonfederated.com>2019-03-06 19:53:57 +0100
commit96f905f40913b915496039d188297a7949b1a6db (patch)
tree54111b6c1ee941cd261cf01c630711787b25c1d3 /app/models
parentb3668a79eca2d185ea57a9ffc2fa012db52e49f0 (diff)
Add optimistic lock to avoid race conditions when handling votes (#10196)
* Add optimistic lock to avoid race conditions when handling votes

* Force-reload polls when getting `ActiveRecord::StaleObjectError`
Diffstat (limited to 'app/models')
-rw-r--r--app/models/poll.rb1
-rw-r--r--app/models/poll_vote.rb3
2 files changed, 4 insertions, 0 deletions
diff --git a/app/models/poll.rb b/app/models/poll.rb
index ab7236d45..da2e25e71 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -15,6 +15,7 @@
 #  last_fetched_at :datetime
 #  created_at      :datetime         not null
 #  updated_at      :datetime         not null
+#  lock_version    :integer          default(0), not null
 #
 
 class Poll < ApplicationRecord
diff --git a/app/models/poll_vote.rb b/app/models/poll_vote.rb
index 9ad66bbf8..ad24eb691 100644
--- a/app/models/poll_vote.rb
+++ b/app/models/poll_vote.rb
@@ -32,5 +32,8 @@ class PollVote < ApplicationRecord
   def increment_counter_cache
     poll.cached_tallies[choice] = (poll.cached_tallies[choice] || 0) + 1
     poll.save
+  rescue ActiveRecord::StaleObjectError
+    poll.reload
+    retry
   end
 end