private void serverRemoved()

in software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java [295:341]


    private void serverRemoved(final MongoDBServer member) {
        try {
            if (LOG.isDebugEnabled())
                LOG.debug("Scheduling removal of member from {}: {}", getName(), member);
            // FIXME is there a chance of race here?
            if (member.equals(sensors().get(PRIMARY_ENTITY)))
                sensors().set(PRIMARY_ENTITY, null);
            executor.submit(new Runnable() {
                @Override
                public void run() {
                    // Wait until the server has been stopped before reconfiguring the set. Quoth the MongoDB doc:
                    // for best results always shut down the mongod instance before removing it from a replica set.
                    Boolean isAvailable = member.sensors().get(MongoDBServer.SERVICE_UP);
                    // Wait for the replica set to elect a new primary if the set is reconfiguring itself.
                    MongoDBServer primary = getPrimary();
                    boolean reschedule;

                    if (primary != null && !isAvailable) {
                        boolean removed = primary.removeMemberFromReplicaSet(member);
                        if (removed) {
                            LOG.info("Removed {} from replica set {}", member, getName());
                            reschedule = false;
                        } else {
                            if (LOG.isDebugEnabled()) {
                                LOG.debug("{} could not be removed from replica set via {}; rescheduling", member, getName());
                            }
                            reschedule = true;
                        }

                    } else {
                        if (LOG.isTraceEnabled()) {
                            LOG.trace("Rescheduling removal of member {} from replica set {}: service_up={}, primary={}",
                                    new Object[]{member, getName(), isAvailable, primary});
                        }
                        reschedule = true;
                    }

                    if (reschedule) {
                        // TODO Could limit number of retries
                        executor.schedule(this, 3, TimeUnit.SECONDS);
                    }
                }
            });
        } catch (Exception e) {
            ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator(member, "Failed to update replicaset", e);
        }
    }