ARTEMIS-742 = replication quorum broken
https://issues.apache.org/jira/browse/ARTEMIS-742
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 @@
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 @@
}
/**
- * 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 @@
return;
if (vote.getVote()) {
total++;
+ latch.countDown();
if (total >= votesNeeded) {
decision = true;
- latch.countDown();
}
}
}
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 @@
*/
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);