in software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java [227:275]
private void setVotingMembers() {
if (LOG.isDebugEnabled())
LOG.debug("Setting voting and non-voting members of replica set: {}", name);
boolean seenPrimary = false;
String expectedPrimary = primary.isPresent()
? primary.get().getHost() + ":" + primary.get().getPort()
: "";
// Ensure an odd number of voters
int setSize = this.members.size();
int nonPrimaryVotingMembers = Math.min(setSize % 2 == 0 ? setSize - 1 : setSize, MAXIMUM_VOTING_MEMBERS);
if (primary.isPresent()) {
if (LOG.isTraceEnabled())
LOG.trace("Reserving vote for primary: " + expectedPrimary);
nonPrimaryVotingMembers -= 1;
}
for (Object member : this.members) {
if (member instanceof BasicBSONObject) {
BasicBSONObject bsonObject = BasicBSONObject.class.cast(member);
String host = bsonObject.getString("host");
// is this member noted as the primary?
if (this.primary.isPresent() && expectedPrimary.equals(host)) {
bsonObject.put("votes", 1);
seenPrimary = true;
if (LOG.isDebugEnabled())
LOG.debug("Voting member (primary) of set {}: {}", name, host);
} else if (nonPrimaryVotingMembers-- > 0) {
bsonObject.put("votes", 1);
if (LOG.isDebugEnabled())
LOG.debug("Voting member of set {}: {}", name, host);
} else {
bsonObject.put("votes", 0);
if (LOG.isDebugEnabled())
LOG.debug("Non-voting member of set {}: {}", name, host);
}
} else {
LOG.error("Unexpected entry in replica set members list: " + member);
}
}
if (primary.isPresent() && !seenPrimary) {
LOG.warn("Cannot give replica set primary a vote in reconfigured set: " +
"primary was indicated as {} but no member with that host and port was seen in the set. " +
"The replica set now has an even number of voters.",
this.primary);
}
}