package org.jgroups.tests;
import org.jgroups.*;
import org.jgroups.util.Util;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
/**
*
* coord.stopFlush() and coord.close() called in sequence cause flush lockup
* See https://jira.jboss.org/jira/browse/JGRP-959
*
*
* @author vladimir
* @since 2.8
*/
@Test(groups = Global.FLUSH, sequential = true)
public class FlushCloseOpenTest extends ChannelTestBase {
@Test
public void testAndLoop() throws Exception {
for (int i = 1; i <= 4; i++) {
Channel channel = createChannel(true, 2);
ReceiverImpl receiver = new ReceiverImpl();
channel.setReceiver(receiver);
channel.setName("A");
channel.connect("testClust");
Channel channel2 = createChannel((JChannel) channel);
ReceiverImpl receiver2 = new ReceiverImpl();
channel2.setReceiver(receiver2);
channel2.setName("B");
channel2.connect("testClust");
sendMessage(channel, "msg1");
sendMessage(channel2, "msg2");
assert Util.startFlush(channel);
assertCount(receiver, 2, receiver2, 2);
channel.stopFlush();
channel.close();
channel = createChannel((JChannel) channel2);
channel.setReceiver(receiver);
channel.setName("A");
channel.connect("testClust");
sendMessage(channel2, "msg3");
assert Util.startFlush(channel2);
assertCount(receiver, 3, receiver2, 3);
channel.stopFlush();
channel2.close();
channel2 = createChannel((JChannel) channel);
channel2.setReceiver(receiver2);
channel2.setName("B");
channel2.connect("testClust");
sendMessage(channel2, "msg4");
assert Util.startFlush(channel2);
assertCount(receiver, 4, receiver2, 4);
channel2.stopFlush();
channel.close();
channel2.close();
receiver.receiveCount.set(0);
receiver2.receiveCount.set(0);
System.out.println("***** Round " + i + " done *****");
}
}
private void sendMessage(Channel channel, Object obj) throws Exception {
if (!channel.isConnected()) {
log.warn("Channel disconnected in send, discarding msg");
return;
}
Message msg = new Message(null, null, obj);
log.debug("Sending message: " + msg);
channel.send(msg);
log.debug("Sent message: " + msg);
}
private void assertCount(ReceiverImpl srv1, long srv1Count, ReceiverImpl srv2, long srv2Count)
throws InterruptedException {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
if (srv1.receiveCount.get() == srv1Count && srv2.receiveCount.get() == srv2Count) {
break;
}
Thread.sleep(10L);
}
assert srv1Count == srv1.receiveCount.get() : "expected " + srv1Count + " but got "
+ srv1.receiveCount;
assert srv2Count == srv2.receiveCount.get() : "expected " + srv2Count + " but got "
+ srv2.receiveCount;
System.out.println("assert OK in " + (System.currentTimeMillis() - start) + "ms");
}
private class ReceiverImpl extends ReceiverAdapter {
final List<Object> msgs = new ArrayList<Object>();
public final AtomicLong receiveCount = new AtomicLong();
public List<Object> getMsgs() {
return msgs;
}
@Override
public void receive(Message msg) {
try {
Object data = msg.getObject();
msgs.add(data);
receiveCount.incrementAndGet();
log.debug("Received msg: " + data);
} catch (Exception e) {
log.error("Receive failed", e);
}
}
@Override
public void viewAccepted(View new_view) {
}
}
}