Search in sources :

Example 11 with Member

use of org.apache.catalina.tribes.Member in project tomcat70 by apache.

the class AbstractReplicatedMap method ping.

/**
 * Sends a ping out to all the members in the cluster, not just map members
 * that this map is alive.
 * @param timeout long
 * @throws ChannelException
 */
protected void ping(long timeout) throws ChannelException {
    MapMessage msg = new MapMessage(this.mapContextName, MapMessage.MSG_PING, false, null, null, null, channel.getLocalMember(false), null);
    if (channel.getMembers().length > 0) {
        try {
            // send a ping, wait for all nodes to reply
            Response[] resp = rpcChannel.send(channel.getMembers(), msg, RpcChannel.ALL_REPLY, (channelSendOptions), (int) accessTimeout);
            for (int i = 0; i < resp.length; i++) {
                MapMessage mapMsg = (MapMessage) resp[i].getMessage();
                try {
                    mapMsg.deserialize(getExternalLoaders());
                    Member member = resp[i].getSource();
                    State state = (State) mapMsg.getValue();
                    if (state.isAvailable()) {
                        memberAlive(member);
                    } else if (state == State.STATETRANSFERRED) {
                        synchronized (mapMembers) {
                            if (log.isInfoEnabled())
                                log.info("Member[" + member + "] is state transferred but not available yet.");
                            if (mapMembers.containsKey(member)) {
                                mapMembers.put(member, Long.valueOf(System.currentTimeMillis()));
                            }
                        }
                    } else {
                        if (log.isInfoEnabled())
                            log.info("Member[" + member + "] is not available yet.");
                    }
                } catch (IOException x) {
                    log.error("Unable to deserialize MapMessage.", x);
                    return;
                } catch (ClassNotFoundException x) {
                    log.error("Unable to deserialize MapMessage.", x);
                    return;
                }
            }
        } catch (ChannelException ce) {
            // Handle known failed members
            FaultyMember[] faultyMembers = ce.getFaultyMembers();
            for (FaultyMember faultyMember : faultyMembers) {
                memberDisappeared(faultyMember.getMember());
            }
            throw ce;
        }
    }
    // update our map of members, expire some if we didn't receive a ping back
    synchronized (mapMembers) {
        Member[] members = mapMembers.keySet().toArray(new Member[mapMembers.size()]);
        long now = System.currentTimeMillis();
        for (Member member : members) {
            long access = mapMembers.get(member).longValue();
            if ((now - access) > timeout) {
                log.warn("Member[" + member + "] in the Map[" + mapname + "] has timed-out in the ping processing.");
                memberDisappeared(member);
            }
        }
    }
// synch
}
Also used : Response(org.apache.catalina.tribes.group.Response) IOException(java.io.IOException) FaultyMember(org.apache.catalina.tribes.ChannelException.FaultyMember) Member(org.apache.catalina.tribes.Member) FaultyMember(org.apache.catalina.tribes.ChannelException.FaultyMember) ChannelException(org.apache.catalina.tribes.ChannelException)

Example 12 with Member

use of org.apache.catalina.tribes.Member in project tomcat70 by apache.

the class AbstractReplicatedMap method mapMemberAdded.

public void mapMemberAdded(Member member) {
    if (member.equals(getChannel().getLocalMember(false)))
        return;
    boolean memberAdded = false;
    // select a backup node if we don't have one
    Member mapMember = getChannel().getMember(member);
    if (mapMember == null) {
        log.warn("Notified member is not registered in the membership:" + member);
        return;
    }
    synchronized (mapMembers) {
        if (!mapMembers.containsKey(mapMember)) {
            if (log.isInfoEnabled())
                log.info("Map member added:" + mapMember);
            mapMembers.put(mapMember, Long.valueOf(System.currentTimeMillis()));
            memberAdded = true;
        }
    }
    if (memberAdded) {
        synchronized (stateMutex) {
            Iterator<Map.Entry<K, MapEntry<K, V>>> i = innerMap.entrySet().iterator();
            while (i.hasNext()) {
                Map.Entry<K, MapEntry<K, V>> e = i.next();
                MapEntry<K, V> entry = innerMap.get(e.getKey());
                if (entry == null)
                    continue;
                if (entry.isPrimary() && (entry.getBackupNodes() == null || entry.getBackupNodes().length == 0)) {
                    try {
                        Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue());
                        entry.setBackupNodes(backup);
                        entry.setPrimary(channel.getLocalMember(false));
                    } catch (ChannelException x) {
                        log.error("Unable to select backup node.", x);
                    }
                // catch
                }
            // end if
            }
        // while
        }
    // synchronized
    }
// end if
}
Also used : FaultyMember(org.apache.catalina.tribes.ChannelException.FaultyMember) Member(org.apache.catalina.tribes.Member) HashMap(java.util.HashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ChannelException(org.apache.catalina.tribes.ChannelException)

Example 13 with Member

use of org.apache.catalina.tribes.Member in project tomcat70 by apache.

the class LazyReplicatedMap method publishEntryInfo.

/**
 * publish info about a map pair (key/value) to other nodes in the cluster
 * @param key Object
 * @param value Object
 * @return Member - the backup node
 * @throws ChannelException
 */
@Override
protected Member[] publishEntryInfo(Object key, Object value) throws ChannelException {
    if (!(key instanceof Serializable && value instanceof Serializable))
        return new Member[0];
    Member[] members = getMapMembers();
    int firstIdx = getNextBackupIndex();
    int nextIdx = firstIdx;
    Member[] backup = new Member[0];
    // there are no backups
    if (members.length == 0 || firstIdx == -1)
        return backup;
    boolean success = false;
    do {
        // select a backup node
        Member next = members[nextIdx];
        // increment for the next round of back up selection
        nextIdx = nextIdx + 1;
        if (nextIdx >= members.length)
            nextIdx = 0;
        if (next == null) {
            continue;
        }
        MapMessage msg = null;
        try {
            Member[] tmpBackup = wrap(next);
            // publish the backup data to one node
            msg = new MapMessage(getMapContextName(), MapMessage.MSG_BACKUP, false, (Serializable) key, (Serializable) value, null, channel.getLocalMember(false), tmpBackup);
            if (log.isTraceEnabled())
                log.trace("Publishing backup data:" + msg + " to: " + next.getName());
            UniqueId id = getChannel().send(tmpBackup, msg, getChannelSendOptions());
            if (log.isTraceEnabled())
                log.trace("Data published:" + msg + " msg Id:" + id);
            // we published out to a backup, mark the test success
            success = true;
            backup = tmpBackup;
        } catch (ChannelException x) {
            log.error("Unable to replicate backup key:" + key + " to backup:" + next + ". Reason:" + x.getMessage(), x);
            continue;
        }
        try {
            // publish the data out to all nodes
            Member[] proxies = excludeFromSet(backup, getMapMembers());
            if (success && proxies.length > 0) {
                msg = new MapMessage(getMapContextName(), MapMessage.MSG_PROXY, false, (Serializable) key, null, null, channel.getLocalMember(false), backup);
                if (log.isTraceEnabled())
                    log.trace("Publishing proxy data:" + msg + " to: " + Arrays.toNameString(proxies));
                getChannel().send(proxies, msg, getChannelSendOptions());
            }
        } catch (ChannelException x) {
            // log the error, but proceed, this should only happen if a node went down,
            // and if the node went down, then it can't receive the message, the others
            // should still get it.
            log.error("Unable to replicate proxy key:" + key + " to backup:" + next + ". Reason:" + x.getMessage(), x);
        }
    } while (!success && (firstIdx != nextIdx));
    return backup;
}
Also used : UniqueId(org.apache.catalina.tribes.UniqueId) Serializable(java.io.Serializable) Member(org.apache.catalina.tribes.Member) ChannelException(org.apache.catalina.tribes.ChannelException)

Example 14 with Member

use of org.apache.catalina.tribes.Member in project tomcat70 by apache.

the class GroupChannel method messageReceived.

/**
 * Callback from the interceptor stack. <br>
 * When a message is received from a remote node, this method will be invoked by
 * the previous interceptor.<br>
 * This method can also be used to send a message to other components within the same application,
 * but its an extreme case, and you're probably better off doing that logic between the applications itself.
 * @param msg ChannelMessage
 */
@Override
public void messageReceived(ChannelMessage msg) {
    if (msg == null)
        return;
    try {
        if (Logs.MESSAGES.isTraceEnabled()) {
            Logs.MESSAGES.trace("GroupChannel - Received msg:" + new UniqueId(msg.getUniqueId()) + " at " + new java.sql.Timestamp(System.currentTimeMillis()) + " from " + msg.getAddress().getName());
        }
        Serializable fwd = null;
        if ((msg.getOptions() & SEND_OPTIONS_BYTE_MESSAGE) == SEND_OPTIONS_BYTE_MESSAGE) {
            fwd = new ByteMessage(msg.getMessage().getBytes());
        } else {
            try {
                fwd = XByteBuffer.deserialize(msg.getMessage().getBytesDirect(), 0, msg.getMessage().getLength());
            } catch (Exception sx) {
                log.error("Unable to deserialize message:" + msg, sx);
                return;
            }
        }
        if (Logs.MESSAGES.isTraceEnabled()) {
            Logs.MESSAGES.trace("GroupChannel - Receive Message:" + new UniqueId(msg.getUniqueId()) + " is " + fwd);
        }
        // get the actual member with the correct alive time
        Member source = msg.getAddress();
        boolean rx = false;
        boolean delivered = false;
        for (int i = 0; i < channelListeners.size(); i++) {
            ChannelListener channelListener = (ChannelListener) channelListeners.get(i);
            if (channelListener != null && channelListener.accept(fwd, source)) {
                channelListener.messageReceived(fwd, source);
                delivered = true;
                // is responsible for returning the reply, otherwise we send an absence reply
                if (channelListener instanceof RpcChannel)
                    rx = true;
            }
        }
        // for
        if ((!rx) && (fwd instanceof RpcMessage)) {
            // if we have a message that requires a response,
            // but none was given, send back an immediate one
            sendNoRpcChannelReply((RpcMessage) fwd, source);
        }
        if (Logs.MESSAGES.isTraceEnabled()) {
            Logs.MESSAGES.trace("GroupChannel delivered[" + delivered + "] id:" + new UniqueId(msg.getUniqueId()));
        }
    } catch (Exception x) {
        // as a warning.
        if (log.isWarnEnabled())
            log.warn("Error receiving message:", x);
        throw new RemoteProcessException("Exception:" + x.getMessage(), x);
    }
}
Also used : UniqueId(org.apache.catalina.tribes.UniqueId) Serializable(java.io.Serializable) ChannelListener(org.apache.catalina.tribes.ChannelListener) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) ChannelException(org.apache.catalina.tribes.ChannelException) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) ByteMessage(org.apache.catalina.tribes.ByteMessage) Member(org.apache.catalina.tribes.Member)

Example 15 with Member

use of org.apache.catalina.tribes.Member in project tomcat70 by apache.

the class MultipointBioSender method close.

private synchronized void close() throws ChannelException {
    ChannelException x = null;
    Object[] members = bioSenders.keySet().toArray();
    for (int i = 0; i < members.length; i++) {
        Member mbr = (Member) members[i];
        try {
            BioSender sender = bioSenders.get(mbr);
            sender.disconnect();
        } catch (Exception e) {
            if (x == null)
                x = new ChannelException(e);
            x.addFaultyMember(mbr, e);
        }
        bioSenders.remove(mbr);
    }
    if (x != null)
        throw x;
}
Also used : Member(org.apache.catalina.tribes.Member) ChannelException(org.apache.catalina.tribes.ChannelException) IOException(java.io.IOException) ChannelException(org.apache.catalina.tribes.ChannelException)

Aggregations

Member (org.apache.catalina.tribes.Member)93 ChannelException (org.apache.catalina.tribes.ChannelException)28 FaultyMember (org.apache.catalina.tribes.ChannelException.FaultyMember)17 Test (org.junit.Test)17 IOException (java.io.IOException)16 MemberImpl (org.apache.catalina.tribes.membership.MemberImpl)15 ReceiverBase (org.apache.catalina.tribes.transport.ReceiverBase)11 ArrayList (java.util.ArrayList)10 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)10 UniqueId (org.apache.catalina.tribes.UniqueId)9 Serializable (java.io.Serializable)6 BigDecimal (java.math.BigDecimal)6 DecimalFormat (java.text.DecimalFormat)6 Response (org.apache.catalina.tribes.group.Response)6 ChannelData (org.apache.catalina.tribes.io.ChannelData)6 XByteBuffer (org.apache.catalina.tribes.io.XByteBuffer)6 SelectionKey (java.nio.channels.SelectionKey)4 Selector (java.nio.channels.Selector)4 Membership (org.apache.catalina.tribes.membership.Membership)4 StaticMember (org.apache.catalina.tribes.membership.StaticMember)4