@Test()
public void TestSchedulerMsg() throws Exception
{
_factory._results.clear();
HelixManager manager = null;
for (int i = 0; i < NODE_NR; i++)
{
String hostDest = "localhost_" + (START_PORT + i);
_startCMResultMap.get(hostDest)._manager.getMessagingService()
.registerMessageHandlerFactory(_factory.getMessageType(), _factory);
manager = _startCMResultMap.get(hostDest)._manager;
}
Message schedulerMessage = new Message(MessageType.SCHEDULER_MSG + "", UUID
.randomUUID().toString());
schedulerMessage.setTgtSessionId("*");
schedulerMessage.setTgtName("CONTROLLER");
// TODO: change it to "ADMIN" ?
schedulerMessage.setSrcName("CONTROLLER");
// Template for the individual message sent to each participant
Message msg = new Message(_factory.getMessageType(), "Template");
msg.setTgtSessionId("*");
msg.setMsgState(MessageState.NEW);
// Criteria to send individual messages
Criteria cr = new Criteria();
cr.setInstanceName("localhost_%");
cr.setRecipientInstanceType(InstanceType.PARTICIPANT);
cr.setSessionSpecific(false);
cr.setResource("%");
cr.setPartition("%");
ObjectMapper mapper = new ObjectMapper();
SerializationConfig serializationConfig = mapper.getSerializationConfig();
serializationConfig.set(SerializationConfig.Feature.INDENT_OUTPUT, true);
StringWriter sw = new StringWriter();
mapper.writeValue(sw, cr);
String crString = sw.toString();
schedulerMessage.getRecord().setSimpleField("Criteria", crString);
schedulerMessage.getRecord().setMapField("MessageTemplate",
msg.getRecord().getSimpleFields());
schedulerMessage.getRecord().setSimpleField("TIMEOUT", "-1");
HelixDataAccessor helixDataAccessor = manager.getHelixDataAccessor();
Builder keyBuilder = helixDataAccessor.keyBuilder();
helixDataAccessor.createProperty(
keyBuilder.controllerMessage(schedulerMessage.getMsgId()),
schedulerMessage);
Thread.sleep(15000);
for(int i = 0; i < 30; i++)
{
Thread.sleep(2000);
if(_PARTITIONS == _factory._results.size())
{
break;
}
}
Assert.assertEquals(_PARTITIONS, _factory._results.size());
PropertyKey controllerTaskStatus = keyBuilder.controllerTaskStatus(
MessageType.SCHEDULER_MSG.toString(), schedulerMessage.getMsgId());
int messageResultCount = 0;
for(int i = 0; i < 10; i++)
{
ZNRecord statusUpdate = helixDataAccessor.getProperty(controllerTaskStatus)
.getRecord();
Assert.assertTrue(statusUpdate.getMapField("SentMessageCount")
.get("MessageCount").equals("" + (_PARTITIONS * 3)));
for(String key : statusUpdate.getMapFields().keySet())
{
if(key.startsWith("MessageResult "))
{
messageResultCount ++;
}
}
if(messageResultCount == _PARTITIONS * 3)
{
break;
}
else
{
Thread.sleep(2000);
}
}
Assert.assertEquals(messageResultCount, _PARTITIONS * 3);
int count = 0;
for (Set<String> val : _factory._results.values())
{
count += val.size();
}
Assert.assertEquals(count, _PARTITIONS * 3);
// test the ZkPathDataDumpTask
String controllerStatusPath = HelixUtil.getControllerPropertyPath(manager.getClusterName(),
PropertyType.STATUSUPDATES_CONTROLLER);
List<String> subPaths = _zkClient.getChildren(controllerStatusPath);
Assert.assertTrue(subPaths.size() > 0);
for(String subPath : subPaths)
{
String nextPath = controllerStatusPath + "/" + subPath;
List<String> subsubPaths = _zkClient.getChildren(nextPath);
Assert.assertTrue(subsubPaths.size() > 0);
}
String instanceStatusPath = HelixUtil.getInstancePropertyPath(manager.getClusterName(), "localhost_" + (START_PORT),
PropertyType.STATUSUPDATES);
subPaths = _zkClient.getChildren(instanceStatusPath);
Assert.assertTrue(subPaths.size() > 0);
for(String subPath : subPaths)