package org.jgroups.tests;
import org.jgroups.Event;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.protocols.Discovery;
import org.jgroups.stack.ProtocolStack;
import org.jgroups.util.Responses;
import org.jgroups.util.Util;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.lang.reflect.Field;
import java.util.Map;
/**
* Tests a leak in Discovery.ping_responses (https://issues.jboss.org/browse/JGRP-1983)
* @author Bela Ban
* @since 3.6.7
*/
@Test(groups=Global.FUNCTIONAL)
public class DiscoveryTest {
protected JChannel a, b, c, d;
protected static final String props="/home/bela/fast.xml";
@BeforeClass
protected void setup() throws Exception {
/* a=new JChannel(props).name("A");
b=new JChannel(props).name("B");
c=new JChannel(props).name("C");
d=new JChannel(props).name("D");*/
a=new JChannel(Util.getTestStack()).name("A");
b=new JChannel(Util.getTestStack()).name("B");
c=new JChannel(Util.getTestStack()).name("C");
d=new JChannel(Util.getTestStack()).name("D");
a.connect("cluster");
b.connect("cluster");
c.connect("cluster");
d.connect("cluster");
Util.waitUntilAllChannelsHaveSameView(10000, 500, a, b, c, d);
System.out.printf("view is %s\n", a.getView());
}
@AfterClass protected void destroy() {Util.close(d,c,b,a);}
/** Makes sure the leak caused by https://issues.jboss.org/browse/JGRP-1983 is not present anymore */
public void testLeakFromCoord() throws Exception {
testLeak(a);
}
public void testLeakFromParticipant() throws Exception {
testLeak(d);
}
protected void testLeak(JChannel discovery_initiator) throws Exception {
ProtocolStack stack=discovery_initiator.getProtocolStack();
Discovery ping=(Discovery)stack.findProtocol(Discovery.class);
ping.discoveryRspExpiryTime(1000);
Field ping_rsps_field=Util.getField(Discovery.class, "ping_responses");
Map<Long,Responses> ping_rsps=(Map<Long,Responses>)Util.getField(ping_rsps_field, ping);
for(int i=1; i <= 10; i++) {
ping.down(Event.FIND_INITIAL_MBRS_EVT);
}
for(int i=0; i < 10; i++) {
Util.sleep(500);
ping.weedOutCompletedDiscoveryResponses();
if(ping_rsps.isEmpty())
break;
System.out.printf("responses map has %d elements:\n%s\n", ping_rsps.size(), print(ping_rsps));
}
assert ping_rsps.isEmpty() : String.format("responses map has %d elements:\n%s\n", ping_rsps.size(), print(ping_rsps));
}
protected static String print(Map<Long,Responses> map) {
StringBuilder sb=new StringBuilder();
for(Responses rsp: map.values())
sb.append(rsp).append("\n");
return sb.toString();
}
}