int replServerID1, int replServerID2,
int domain1ServerId, int domain2ServerId)
throws Exception
{
String testService = "test";
ReplicationServer replServer1 = null;
ReplicationServer replServer2 = null;
FakeReplicationDomain domain1 = null;
FakeReplicationDomain domain2 = null;
try
{
// find a free port for the replicationServer
ServerSocket socket = TestCaseUtils.bindFreePort();
int replServerPort1 = socket.getLocalPort();
socket.close();
socket = TestCaseUtils.bindFreePort();
int replServerPort2 = socket.getLocalPort();
socket.close();
TreeSet<String> replserver1 = new TreeSet<String>();
replserver1.add("localhost:" + replServerPort1);
TreeSet<String> replserver2 = new TreeSet<String>();
replserver2.add("localhost:" + replServerPort2);
ReplServerFakeConfiguration conf1 =
new ReplServerFakeConfiguration(
replServerPort1, "ReplicationDomainTestDb1",
0, replServerID1, 0, 100, replserver2);
ReplServerFakeConfiguration conf2 =
new ReplServerFakeConfiguration(
replServerPort2, "ReplicationDomainTestDb2",
0, replServerID2, 0, 100, replserver1);
replServer1 = new ReplicationServer(conf1);;
replServer2 = new ReplicationServer(conf2);
ArrayList<String> servers = new ArrayList<String>(1);
servers.add("localhost:" + replServerPort1);
BlockingQueue<UpdateMsg> rcvQueue1 = new LinkedBlockingQueue<UpdateMsg>();
domain1 = new FakeReplicationDomain(
testService, domain1ServerId, servers, 100, 1000, rcvQueue1);
ArrayList<String> servers2 = new ArrayList<String>(1);
servers2.add("localhost:" + replServerPort2);
BlockingQueue<UpdateMsg> rcvQueue2 = new LinkedBlockingQueue<UpdateMsg>();
domain2 = new FakeReplicationDomain(
testService, domain2ServerId, servers2, 100, 1000, rcvQueue2);
Thread.sleep(500);
/*
* Publish a message from domain1,
* Check that domain2 receives it shortly after.
*/
byte[] test = {1, 2, 3 ,4, 0, 1, 2, 3, 4, 5};
domain1.publish(test);
UpdateMsg rcvdMsg = rcvQueue2.poll(20, TimeUnit.SECONDS);
assertNotNull(rcvdMsg);
assertEquals(test, rcvdMsg.getPayload());
/*
* Now test the resetReplicationLog() method.
*/
List<RSInfo> replServers = domain1.getRsList();
for (RSInfo replServerInfo : replServers)
{
// The generation Id of the remote should be 1
assertEquals(replServerInfo.getGenerationId(), 1,
"Unexpected value of generationId in RSInfo for RS="
+ replServerInfo.toString());
}
for (DSInfo serverInfo : domain1.getReplicasList())
{
assertEquals(serverInfo.getStatus(), ServerStatus.NORMAL_STATUS);
}
domain1.setGenerationID(2);
domain1.resetReplicationLog();
Thread.sleep(500);
replServers = domain1.getRsList();
for (RSInfo replServerInfo : replServers)
{
// The generation Id of the remote should now be 2
assertEquals(replServerInfo.getGenerationId(), 2,
"Unexpected value of generationId in RSInfo for RS="
+ replServerInfo.toString());
}
int sleepTime = 50;
while (true)
{
try
{
for (DSInfo serverInfo : domain1.getReplicasList())
{
if (serverInfo.getDsId() == domain2ServerId)
assertEquals(serverInfo.getStatus(), ServerStatus.BAD_GEN_ID_STATUS);
else
{
assertTrue(serverInfo.getDsId() == domain1ServerId);
assertTrue(serverInfo.getStatus() == ServerStatus.NORMAL_STATUS);
}
}
for (DSInfo serverInfo : domain2.getReplicasList())
{
if (serverInfo.getDsId() == domain2ServerId)
assertTrue(serverInfo.getStatus() == ServerStatus.BAD_GEN_ID_STATUS);
else
{
assertTrue(serverInfo.getDsId() == domain1ServerId);
assertTrue(serverInfo.getStatus() == ServerStatus.NORMAL_STATUS);
}
}
Map<Integer, ServerState> states1 = domain1.getReplicaStates();
ServerState state2 = states1.get(domain2ServerId);
assertNotNull(state2, "getReplicaStates is not showing DS2");
Map<Integer, ServerState> states2 = domain2.getReplicaStates();
ServerState state1 = states2.get(domain1ServerId);
assertNotNull(state1, "getReplicaStates is not showing DS1");
// if we reach this point all tests are OK
break;
}
catch (AssertionError e)
{
if (sleepTime < 30000)
{
Thread.sleep(sleepTime);
sleepTime *=2;
}
else
throw e;
}
}
}
finally
{
if (domain1 != null)
domain1.stopDomain();
if (domain2 != null)
domain2.stopDomain();
if (replServer1 != null)
replServer1.remove();
if (replServer2 != null)
replServer2.remove();
}
}