in modules/endpoint-tribes/src/main/java/org/apache/tuscany/sca/endpoint/tribes/AbstractReplicatedMap.java [750:812]
public void memberDisappeared(Member member) {
boolean removed = false;
synchronized (mapMembers) {
removed = (mapMembers.remove(member) != null);
if (!removed) {
if (log.isDebugEnabled())
log.debug("Member[" + member + "] disappeared, but was not present in the map.");
return; //the member was not part of our map.
}
}
Iterator<Map.Entry<Object, Object>> i = super.entrySet().iterator();
while (i.hasNext()) {
Map.Entry<Object, Object> e = i.next();
MapEntry entry = (MapEntry)super.get(e.getKey());
if (entry == null)
continue;
if (entry.isPrimary() && inSet(member, entry.getBackupNodes())) {
if (log.isDebugEnabled())
log.debug("[1] Primary choosing a new backup");
try {
Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue());
entry.setBackupNodes(backup);
entry.setPrimary(channel.getLocalMember(false));
} catch (ChannelException x) {
log.error("Unable to relocate[" + entry.getKey() + "] to a new backup node", x);
}
} else if (member.equals(entry.getPrimary())) {
if (log.isDebugEnabled())
log.debug("[2] Primary disappeared");
entry.setPrimary(null);
} //end if
if (entry.isProxy() && entry.getPrimary() == null
&& entry.getBackupNodes() != null
&& entry.getBackupNodes().length == 1
&& entry.getBackupNodes()[0].equals(member)) {
//remove proxies that have no backup nor primaries
if (log.isDebugEnabled())
log.debug("[3] Removing orphaned proxy");
i.remove();
} else if (entry.getPrimary() == null && entry.isBackup()
&& entry.getBackupNodes() != null
&& entry.getBackupNodes().length == 1
&& entry.getBackupNodes()[0].equals(channel.getLocalMember(false))) {
try {
if (log.isDebugEnabled())
log.debug("[4] Backup becoming primary");
entry.setPrimary(channel.getLocalMember(false));
entry.setBackup(false);
entry.setProxy(false);
Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue());
entry.setBackupNodes(backup);
if (mapOwner != null)
mapOwner.objectMadePrimay(entry.getKey(), entry.getValue());
} catch (ChannelException x) {
log.error("Unable to relocate[" + entry.getKey() + "] to a new backup node", x);
}
}
} //while
}