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