public void memberDisappeared()

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
    }