use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class TestMemberImplSerialization method testSerializationOne.
@Test
public void testSerializationOne() throws Exception {
Member m = m1;
byte[] md1 = m.getData(false, true);
byte[] mda1 = m.getData(false, false);
Assert.assertTrue(Arrays.equals(md1, mda1));
Assert.assertTrue(md1 == mda1);
mda1 = m.getData(true, true);
Member ma1 = MemberImpl.getMember(mda1);
Assert.assertTrue(compareMembers(m, ma1));
mda1 = p1.getData(false);
Assert.assertFalse(Arrays.equals(md1, mda1));
ma1 = MemberImpl.getMember(mda1);
Assert.assertTrue(compareMembers(p1, ma1));
md1 = m.getData(true, true);
Thread.sleep(50);
mda1 = m.getData(true, true);
Member a1 = MemberImpl.getMember(md1);
Member a2 = MemberImpl.getMember(mda1);
Assert.assertTrue(a1.equals(a2));
Assert.assertFalse(Arrays.equals(md1, mda1));
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class SimpleTcpCluster method messageReceived.
public void messageReceived(ClusterMessage message) {
if (log.isDebugEnabled() && message != null) {
log.debug("Assuming clocks are synched: Replication for " + message.getUniqueId() + " took=" + (System.currentTimeMillis() - (message).getTimestamp()) + " ms.");
}
// invoke all the listeners
boolean accepted = false;
if (message != null) {
for (ClusterListener listener : clusterListeners) {
if (listener.accept(message)) {
accepted = true;
listener.messageReceived(message);
}
}
if (!accepted && notifyLifecycleListenerOnFailure) {
Member dest = message.getAddress();
// Notify our interested LifecycleListeners
fireLifecycleEvent(RECEIVE_MESSAGE_FAILURE_EVENT, new SendMessageData(message, dest, null));
if (log.isDebugEnabled()) {
log.debug("Message " + message.toString() + " from type " + message.getClass().getName() + " transferred but no listener registered");
}
}
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class DeltaManager method getAllClusterSessions.
/**
* get from first session master the backup from all clustered sessions
* @see #findSessionMasterMember()
*/
public synchronized void getAllClusterSessions() {
if (cluster != null && cluster.getMembers().length > 0) {
long beforeSendTime = System.currentTimeMillis();
Member mbr = findSessionMasterMember();
if (mbr == null) {
// No domain member found
return;
}
SessionMessage msg = new SessionMessageImpl(this.getName(), SessionMessage.EVT_GET_ALL_SESSIONS, null, "GET-ALL", "GET-ALL-" + getName());
msg.setTimestamp(beforeSendTime);
// set reference time
stateTransferCreateSendTime = beforeSendTime;
// request session state
counterSend_EVT_GET_ALL_SESSIONS++;
stateTransferred = false;
// FIXME This send call block the deploy thread, when sender waitForAck is enabled
try {
synchronized (receivedMessageQueue) {
receiverQueue = true;
}
cluster.send(msg, mbr, Channel.SEND_OPTIONS_ASYNCHRONOUS);
if (log.isInfoEnabled()) {
log.info(sm.getString("deltaManager.waitForSessionState", getName(), mbr, Integer.valueOf(getStateTransferTimeout())));
}
// FIXME At sender ack mode this method check only the state
// transfer and resend is a problem!
waitForSendAllSessions(beforeSendTime);
} finally {
synchronized (receivedMessageQueue) {
for (SessionMessage smsg : receivedMessageQueue) {
if (!stateTimestampDrop) {
messageReceived(smsg, smsg.getAddress());
} else {
if (smsg.getEventType() != SessionMessage.EVT_GET_ALL_SESSIONS && smsg.getTimestamp() >= stateTransferCreateSendTime) {
// FIXME handle EVT_GET_ALL_SESSIONS later
messageReceived(smsg, smsg.getAddress());
} else {
if (log.isWarnEnabled()) {
log.warn(sm.getString("deltaManager.dropMessage", getName(), smsg.getEventTypeString(), new Date(stateTransferCreateSendTime), new Date(smsg.getTimestamp())));
}
}
}
}
receivedMessageQueue.clear();
receiverQueue = false;
}
}
} else {
if (log.isInfoEnabled()) {
log.info(sm.getString("deltaManager.noMembers", getName()));
}
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class NonBlockingCoordinator method startElection.
// ============================================================================================================
// COORDINATION HANDLING
// ============================================================================================================
public void startElection(boolean force) throws ChannelException {
synchronized (electionMutex) {
Member local = getLocalMember(false);
Member[] others = membership.getMembers();
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_START_ELECT, this, "Election initiated"));
if (others.length == 0) {
this.viewId = new UniqueId(UUIDGenerator.randomUUID(false));
this.view = new Membership(local, AbsoluteOrder.comp, true);
this.handleViewConf(createElectionMsg(local, others, local), view);
// the only member, no need for an election
return;
}
if (suggestedviewId != null) {
if (view != null && Arrays.diff(view, suggestedView, local).length == 0 && Arrays.diff(suggestedView, view, local).length == 0) {
suggestedviewId = null;
suggestedView = null;
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, "Election abandoned, running election matches view"));
} else {
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, "Election abandoned, election running"));
}
// election already running, I'm not allowed to have two of them
return;
}
if (view != null && Arrays.diff(view, membership, local).length == 0 && Arrays.diff(membership, view, local).length == 0) {
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, "Election abandoned, view matches membership"));
// already have this view installed
return;
}
int prio = AbsoluteOrder.comp.compare(local, others[0]);
// am I the leader in my view?
Member leader = (prio < 0) ? local : others[0];
if (local.equals(leader) || force) {
CoordinationMessage msg = createElectionMsg(local, others, leader);
suggestedviewId = msg.getId();
suggestedView = new Membership(local, AbsoluteOrder.comp, true);
Arrays.fill(suggestedView, msg.getMembers());
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_PROCESS_ELECT, this, "Election, sending request"));
sendElectionMsg(local, others[0], msg);
} else {
try {
coordMsgReceived.set(false);
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_WAIT_FOR_MSG, this, "Election, waiting for request"));
electionMutex.wait(waitForCoordMsgTimeout);
} catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
String msg;
if (suggestedviewId == null && !coordMsgReceived.get()) {
if (Thread.interrupted()) {
msg = "Election abandoned, waiting interrupted.";
} else {
msg = "Election abandoned, waiting timed out.";
}
} else {
msg = "Election abandoned, received a message";
}
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, msg));
}
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class OrderInterceptor method sendMessage.
@Override
public void sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException {
if (!okToProcess(msg.getOptions())) {
super.sendMessage(destination, msg, payload);
return;
}
ChannelException cx = null;
for (Member member : destination) {
try {
int nr = 0;
outLock.writeLock().lock();
try {
nr = incCounter(member);
} finally {
outLock.writeLock().unlock();
}
// reduce byte copy
msg.getMessage().append(nr);
try {
getNext().sendMessage(new Member[] { member }, msg, payload);
} finally {
msg.getMessage().trim(4);
}
} catch (ChannelException x) {
if (cx == null) {
cx = x;
}
cx.addFaultyMember(x.getFaultyMembers());
}
}
// for
if (cx != null) {
throw cx;
}
}
Aggregations