use of org.apache.catalina.tribes.Member in project tomcat70 by apache.
the class OrderInterceptor method processIncoming.
/**
* @param order MessageOrder
* @return boolean - true if a message expired and was processed
*/
protected boolean processIncoming(MessageOrder order) {
boolean result = false;
Member member = order.getMessage().getAddress();
Counter cnt = getInCounter(member);
MessageOrder tmp = incoming.get(member);
if (tmp != null) {
order = MessageOrder.add(tmp, order);
}
while ((order != null) && (order.getMsgNr() <= cnt.getCounter())) {
// we are right on target. process orders
if (order.getMsgNr() == cnt.getCounter())
cnt.inc();
else if (order.getMsgNr() > cnt.getCounter())
cnt.setCounter(order.getMsgNr());
super.messageReceived(order.getMessage());
order.setMessage(null);
order = order.next;
}
MessageOrder head = order;
MessageOrder prev = null;
tmp = order;
// flag to empty out the queue when it larger than maxQueue
boolean empty = order != null ? order.getCount() >= maxQueue : false;
while (tmp != null) {
// process expired messages or empty out the queue
if (tmp.isExpired(expire) || empty) {
// reset the head
if (tmp == head)
head = tmp.next;
cnt.setCounter(tmp.getMsgNr() + 1);
if (getForwardExpired())
super.messageReceived(tmp.getMessage());
tmp.setMessage(null);
tmp = tmp.next;
if (prev != null)
prev.next = tmp;
result = true;
} else {
prev = tmp;
tmp = tmp.next;
}
}
if (head == null)
incoming.remove(member);
else
incoming.put(member, head);
return result;
}
use of org.apache.catalina.tribes.Member in project tomcat70 by apache.
the class TcpFailureDetector method performBasicCheck.
protected void performBasicCheck() {
// update all alive times
Member[] members = super.getMembers();
for (int i = 0; members != null && i < members.length; i++) {
if (addSuspects.containsKey(members[i]) && membership.getMember(members[i]) == null) {
// avoid temporary adding member.
continue;
}
if (membership.memberAlive((MemberImpl) members[i])) {
// we don't have this one in our membership, check to see if he/she is alive
if (memberAlive(members[i])) {
log.warn("Member added, even though we weren't notified:" + members[i]);
super.memberAdded(members[i]);
} else {
membership.removeMember((MemberImpl) members[i]);
}
// end if
}
// end if
}
// for
// check suspect members if they are still alive,
// if not, simply issue the memberDisappeared message
MemberImpl[] keys = removeSuspects.keySet().toArray(new MemberImpl[removeSuspects.size()]);
for (int i = 0; i < keys.length; i++) {
MemberImpl m = keys[i];
if (membership.getMember(m) != null && (!memberAlive(m))) {
membership.removeMember(m);
if (m instanceof StaticMember) {
addSuspects.put(m, Long.valueOf(System.currentTimeMillis()));
}
super.memberDisappeared(m);
removeSuspects.remove(m);
if (log.isInfoEnabled())
log.info("Suspect member, confirmed dead.[" + m + "]");
} else {
if (removeSuspectsTimeout > 0) {
long timeNow = System.currentTimeMillis();
int timeIdle = (int) ((timeNow - removeSuspects.get(m).longValue()) / 1000L);
if (timeIdle > removeSuspectsTimeout) {
// remove suspect member
removeSuspects.remove(m);
}
}
}
}
// check add suspects members if they are alive now,
// if they are, simply issue the memberAdded message
keys = addSuspects.keySet().toArray(new MemberImpl[addSuspects.size()]);
for (int i = 0; i < keys.length; i++) {
MemberImpl m = keys[i];
if (membership.getMember(m) == null && (memberAlive(m))) {
membership.memberAlive(m);
super.memberAdded(m);
addSuspects.remove(m);
if (log.isInfoEnabled())
log.info("Suspect member, confirmed alive.[" + m + "]");
}
// end if
}
}
use of org.apache.catalina.tribes.Member in project tomcat70 by apache.
the class RpcChannel method messageReceived.
@Override
public void messageReceived(Serializable msg, Member sender) {
RpcMessage rmsg = (RpcMessage) msg;
RpcCollectorKey key = new RpcCollectorKey(rmsg.uuid);
if (rmsg.reply) {
RpcCollector collector = responseMap.get(key);
if (collector == null) {
if (!(rmsg instanceof RpcMessage.NoRpcChannelReply))
callback.leftOver(rmsg.message, sender);
} else {
synchronized (collector) {
// make sure it hasn't been removed
if (responseMap.containsKey(key)) {
if ((rmsg instanceof RpcMessage.NoRpcChannelReply))
collector.destcnt--;
else
collector.addResponse(rmsg.message, sender);
if (collector.isComplete())
collector.notifyAll();
} else {
if (!(rmsg instanceof RpcMessage.NoRpcChannelReply))
callback.leftOver(rmsg.message, sender);
}
}
// synchronized
}
// end if
} else {
boolean finished = false;
final ExtendedRpcCallback excallback = (callback instanceof ExtendedRpcCallback) ? ((ExtendedRpcCallback) callback) : null;
boolean asyncReply = ((replyMessageOptions & Channel.SEND_OPTIONS_ASYNCHRONOUS) == Channel.SEND_OPTIONS_ASYNCHRONOUS);
Serializable reply = callback.replyRequest(rmsg.message, sender);
ErrorHandler handler = null;
final Serializable request = msg;
final Serializable response = reply;
final Member fsender = sender;
if (excallback != null && asyncReply) {
handler = new ErrorHandler() {
@Override
public void handleError(ChannelException x, UniqueId id) {
excallback.replyFailed(request, response, fsender, x);
}
@Override
public void handleCompletion(UniqueId id) {
excallback.replySucceeded(request, response, fsender);
}
};
}
rmsg.reply = true;
rmsg.message = reply;
try {
if (handler != null) {
channel.send(new Member[] { sender }, rmsg, replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK, handler);
} else {
channel.send(new Member[] { sender }, rmsg, replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK);
}
finished = true;
} catch (Exception x) {
if (excallback != null && !asyncReply) {
excallback.replyFailed(rmsg.message, reply, sender, x);
} else {
log.error("Unable to send back reply in RpcChannel.", x);
}
}
if (finished && excallback != null && !asyncReply) {
excallback.replySucceeded(rmsg.message, reply, sender);
}
}
// end if
}
use of org.apache.catalina.tribes.Member in project tomcat70 by apache.
the class AbstractReplicatedMap method transferState.
public void transferState() {
try {
Member[] members = getMapMembers();
Member backup = members.length > 0 ? (Member) members[0] : null;
if (backup != null) {
MapMessage msg = new MapMessage(mapContextName, getStateMessageType(), false, null, null, null, null, null);
Response[] resp = rpcChannel.send(new Member[] { backup }, msg, RpcChannel.FIRST_REPLY, channelSendOptions, rpcTimeout);
if (resp.length > 0) {
synchronized (stateMutex) {
msg = (MapMessage) resp[0].getMessage();
msg.deserialize(getExternalLoaders());
ArrayList<?> list = (ArrayList<?>) msg.getValue();
for (int i = 0; i < list.size(); i++) {
messageReceived((Serializable) list.get(i), resp[0].getSource());
}
// for
}
stateTransferred = true;
} else {
log.warn("Transfer state, 0 replies, probably a timeout.");
}
}
} catch (ChannelException x) {
log.error("Unable to transfer AbstractReplicatedMap state.", x);
} catch (IOException x) {
log.error("Unable to transfer AbstractReplicatedMap state.", x);
} catch (ClassNotFoundException x) {
log.error("Unable to transfer AbstractReplicatedMap state.", x);
}
this.state = State.STATETRANSFERRED;
}
use of org.apache.catalina.tribes.Member in project tomcat70 by apache.
the class AbstractReplicatedMap method leftOver.
/**
* If the reply has already been sent to the requesting thread,
* the rpc callback can handle any data that comes in after the fact.
* @param msg Serializable
* @param sender Member
*/
@Override
public void leftOver(Serializable msg, Member sender) {
// left over membership messages
if (!(msg instanceof MapMessage))
return;
MapMessage mapmsg = (MapMessage) msg;
try {
mapmsg.deserialize(getExternalLoaders());
if (mapmsg.getMsgType() == MapMessage.MSG_START) {
mapMemberAdded(mapmsg.getPrimary());
} else if (mapmsg.getMsgType() == MapMessage.MSG_INIT) {
memberAlive(mapmsg.getPrimary());
} else if (mapmsg.getMsgType() == MapMessage.MSG_PING) {
Member member = mapmsg.getPrimary();
if (log.isInfoEnabled())
log.info("PING message has been received beyond the timeout period. " + "The map member[" + member + "] might have been removed from the map membership.");
State state = (State) mapmsg.getValue();
if (state.isAvailable()) {
memberAlive(member);
}
} else {
// other messages are ignored.
if (log.isInfoEnabled())
log.info("Message[" + mapmsg.getTypeDesc() + "] is ignored.");
}
} catch (IOException x) {
log.error("Unable to deserialize MapMessage.", x);
} catch (ClassNotFoundException x) {
log.error("Unable to deserialize MapMessage.", x);
}
}
Aggregations