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