private void setVotingMembers()

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);
        }
    }