activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From clebertsuco...@apache.org
Subject [1/2] activemq-artemis git commit: ARTEMIS-742 = replication quorum broken
Date Wed, 21 Sep 2016 14:40:33 GMT
Repository: activemq-artemis
Updated Branches:
  refs/heads/master 501d127b3 -> 4b5672379


ARTEMIS-742 = replication quorum broken

https://issues.apache.org/jira/browse/ARTEMIS-742


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/680f84b5
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/680f84b5
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/680f84b5

Branch: refs/heads/master
Commit: 680f84b5a28b8f1af85640a32c2c0b936a890d5a
Parents: 501d127
Author: Andy Taylor <andy.tayls67@gmail.com>
Authored: Tue Sep 6 11:49:23 2016 +0100
Committer: Andy Taylor <andy.tayls67@gmail.com>
Committed: Wed Sep 21 13:52:36 2016 +0100

----------------------------------------------------------------------
 .../cluster/qourum/QuorumVoteServerConnect.java | 47 ++++++++++----------
 .../qourum/SharedNothingBackupQuorum.java       |  2 +-
 2 files changed, 25 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/680f84b5/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/QuorumVoteServerConnect.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/QuorumVoteServerConnect.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/QuorumVoteServerConnect.java
index 79e41ee..352e5e3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/QuorumVoteServerConnect.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/QuorumVoteServerConnect.java
@@ -31,35 +31,35 @@ public class QuorumVoteServerConnect extends QuorumVote<BooleanVote,
Boolean> {
    private static final SimpleString LIVE_FAILOVER_VOTE = new SimpleString("LIVE_FAILOVER)VOTE");
    private final CountDownLatch latch;
 
-   private double votesNeeded;
+   private int votesNeeded;
 
    private int total = 0;
 
    private boolean decision = false;
 
    /**
-    * vote the remaining nodes not including ourself., so
-    * 1 remaining nodes would be 0/2 = 0 vote needed
-    * 2 remaining nodes would be 1/2 = 0 vote needed
-    * 3 remaining nodes would be 2/2 = 1 vote needed
-    * 4 remaining nodes would be 3/2 = 2 vote needed
-    * 5 remaining nodes would be 4/2 = 3 vote needed
-    * 6 remaining nodes would be 5/2 = 3 vote needed
+    * live nodes | remaining nodes |  majority   | votes needed
+    *     1      |       0         |     0       |      0
+    *     2      |       1         |     1       |      1
+    *     n      |    r = n-1      |   n/2 + 1   |   n/2 + 1 rounded
+    *     3      |       2         |     2.5     |      2
+    *     4      |       3         |      3      |      3
+    *     5      |       4         |     3.5     |      3
+    *     6      |       5         |      4      |      4
     */
    public QuorumVoteServerConnect(int size, StorageManager storageManager) {
       super(LIVE_FAILOVER_VOTE);
-      //we don't count ourself
-      int actualSize = size - 1;
-      if (actualSize <= 2) {
-         votesNeeded = actualSize / 2;
+      double majority;
+      if (size <= 2) {
+         majority = ((double)size) / 2;
       }
       else {
          //even
-         votesNeeded = actualSize / 2 + 1;
+         majority = ((double)size) / 2 + 1;
       }
       //votes needed could be say 2.5 so we add 1 in this case
-      int latchSize = votesNeeded > (int) votesNeeded ? (int) votesNeeded + 1 : (int)
votesNeeded;
-      latch = new CountDownLatch(latchSize);
+      votesNeeded = (int) majority;
+      latch = new CountDownLatch(votesNeeded);
       if (votesNeeded == 0) {
          decision = true;
       }
@@ -86,13 +86,14 @@ public class QuorumVoteServerConnect extends QuorumVote<BooleanVote,
Boolean> {
    }
 
    /**
-    * vote the remaining nodes not including ourself., so
-    * 1 remaining nodes would be 0/2 = 0 vote needed
-    * 2 remaining nodes would be 1/2 = 0 vote needed
-    * 3 remaining nodes would be 2/2 = 1 vote needed
-    * 4 remaining nodes would be 3/2 = 2 vote needed
-    * 5 remaining nodes would be 4/2 = 3 vote needed
-    * 6 remaining nodes would be 5/2 = 3 vote needed
+    * live nodes | remaining nodes |  majority   | votes needed
+    *     1      |       0         |     0       |      0
+    *     2      |       1         |     1       |      1
+    *     n      |    r = n-1      |   n/2 + 1   |   n/2 + 1 rounded
+    *     3      |       2         |     2.5     |      2
+    *     4      |       3         |      3      |      3
+    *     5      |       4         |     3.5     |      3
+    *     6      |       5         |      4      |      4
     *
     * @param vote the vote to make.
     */
@@ -102,9 +103,9 @@ public class QuorumVoteServerConnect extends QuorumVote<BooleanVote,
Boolean> {
          return;
       if (vote.getVote()) {
          total++;
+         latch.countDown();
          if (total >= votesNeeded) {
             decision = true;
-            latch.countDown();
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/680f84b5/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/SharedNothingBackupQuorum.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/SharedNothingBackupQuorum.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/SharedNothingBackupQuorum.java
index c1bf6a8..5a95791 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/SharedNothingBackupQuorum.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/qourum/SharedNothingBackupQuorum.java
@@ -252,7 +252,7 @@ public class SharedNothingBackupQuorum implements Quorum, SessionFailureListener
     */
    private boolean isLiveDown() {
       // we use 1 less than the max cluste size as we arent bothered about the replicated
live node
-      int size = quorumManager.getMaxClusterSize() - 1;
+      int size = quorumManager.getMaxClusterSize();
 
       QuorumVoteServerConnect quorumVote = new QuorumVoteServerConnect(size, storageManager);
 


Mime
View raw message