lock_review_update-2016.1.patch #1

  • //
  • guest/
  • jason_leonard/
  • swarm/
  • module/
  • lock_review_update-2016.1.patch
  • View
  • Commits
  • Open Download .zip Download (2 KB)
diff -rupN module.orig/Reviews/src/Reviews/Listener/Review.php module/Reviews/src/Reviews/Listener/Review.php
--- module.orig/Reviews/src/Reviews/Listener/Review.php	2016-07-27 09:08:47.000000000 +0000
+++ module/Reviews/src/Reviews/Listener/Review.php	2016-07-27 09:32:31.000000000 +0000
@@ -15,6 +15,7 @@ use Groups\Model\Group;
 use P4\Spec\Change;
 use P4\Spec\Exception\NotFoundException as SpecNotFoundException;
 use Projects\Model\Project;
+use Record\Lock\Lock;
 use Reviews\Filter\GitInfo;
 use Reviews\Model\Review as ReviewModel;
 use Users\Model\User;
@@ -128,6 +129,14 @@ class Review extends AbstractListenerAgg
                     }
                 }
 
+                // lock the next bit via our advisory locking to avoid potential race condition where another
+                // process tries to update a review from the same review id
+                $lock = new Lock(ReviewModel::LOCK_CHANGE_PREFIX . $id, $p4Admin);
+                $lock->lock();
+
+                try
+                {
+
                 $review->updateFromChange(
                     $updateChange,
                     isset($config['reviews']['unapprove_modified'])
@@ -135,6 +144,16 @@ class Review extends AbstractListenerAgg
                     : true
                 );
 
+                } catch (\Exception $e) {
+                    // we handle this after unlocking
+                }
+                $lock->unlock();
+
+                // rethrow any errors we got when we were locked down
+                if (isset($e)) {
+                    throw $e;
+                }
+
                 // ensure any new @mentions or @*mentions in the change description are added
                 // we only count new @mentions to avoid resurrecting removed/un-required reviewers.
                 $mentions = array_diff(Linkify::getCallouts($updateChange->getDescription()), $oldMentions);
# Change User Description Committed
#1 19977 jason_leonard Adding latest patches for Swarm 2016.1

Adding: Client reset patch for ClientPool to prevent exception with dirty client.
Adding: Lock review update patch for preventing a race condition whilst Swarm updates or creates a review.
Adding: Workers no tasks log patch for removing a "no tasks in queue" message whilst capturing debug logs.
Updating: moderators email patch for allowing moderators to receive review change emails.
Updating: projects caseinsensivie matching patch to workaround P4PHP case sensitivity issues when selecting a change's project.