use of org.apache.heron.spi.statemgr.SchedulerStateManagerAdaptor in project heron by twitter.
the class SchedulerMain method runScheduler.
/**
* Run the scheduler.
* It is a blocking call, and it will return in 2 cases:
* 1. The topology is requested to kill
* 2. Unexpected exceptions happen
*
* @return true if scheduled successfully
*/
public boolean runScheduler() {
IScheduler scheduler = null;
String statemgrClass = Context.stateManagerClass(config);
IStateManager statemgr;
try {
// create an instance of state manager
statemgr = ReflectionUtils.newInstance(statemgrClass);
} catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
LOG.log(Level.SEVERE, "Failed to instantiate instances using config: " + config, e);
return false;
}
SchedulerServer server = null;
boolean isSuccessful = false;
// Put it in a try block so that we can always clean resources
try {
// initialize the state manager
statemgr.initialize(config);
// TODO(mfu): timeout should read from config
SchedulerStateManagerAdaptor adaptor = new SchedulerStateManagerAdaptor(statemgr, 5000);
// get a packed plan and schedule it
PackingPlans.PackingPlan serializedPackingPlan = adaptor.getPackingPlan(topology.getName());
if (serializedPackingPlan == null) {
LOG.log(Level.SEVERE, "Failed to fetch PackingPlan for topology:{0} from the state manager", topology.getName());
return false;
}
LOG.log(Level.INFO, "Packing plan fetched from state: {0}", serializedPackingPlan);
PackingPlan packedPlan = new PackingPlanProtoDeserializer().fromProto(serializedPackingPlan);
// build the runtime config
LauncherUtils launcherUtils = LauncherUtils.getInstance();
Config runtime = Config.newBuilder().putAll(launcherUtils.createPrimaryRuntime(topology)).putAll(launcherUtils.createAdaptorRuntime(adaptor)).put(Key.SCHEDULER_SHUTDOWN, getShutdown()).put(Key.SCHEDULER_PROPERTIES, properties).build();
Config ytruntime = launcherUtils.createConfigWithPackingDetails(runtime, packedPlan);
// invoke scheduler
scheduler = launcherUtils.getSchedulerInstance(config, ytruntime);
if (scheduler == null) {
return false;
}
isSuccessful = scheduler.onSchedule(packedPlan);
if (!isSuccessful) {
LOG.severe("Failed to schedule topology");
return false;
}
// Failures in server initialization throw exceptions
// get the scheduler server endpoint for receiving requests
server = getServer(ytruntime, scheduler, schedulerServerPort);
// start the server to manage runtime requests
server.start();
// write the scheduler location to state manager
// Make sure it happens after IScheduler.onScheduler
isSuccessful = SchedulerUtils.setSchedulerLocation(runtime, String.format("%s:%d", server.getHost(), server.getPort()), scheduler);
if (isSuccessful) {
// wait until kill request or some interrupt occurs if the scheduler starts successfully
LOG.info("Waiting for termination... ");
Runtime.schedulerShutdown(ytruntime).await();
}
} catch (IOException e) {
LOG.log(Level.SEVERE, "Failed to start server", e);
return false;
} finally {
// Clean the resources
if (server != null) {
server.stop();
}
// 4. Close the resources
SysUtils.closeIgnoringExceptions(scheduler);
SysUtils.closeIgnoringExceptions(statemgr);
}
return isSuccessful;
}
use of org.apache.heron.spi.statemgr.SchedulerStateManagerAdaptor in project heron by twitter.
the class LaunchRunnerTest method testSetTopologyFail.
@Test(expected = LauncherException.class)
public void testSetTopologyFail() throws Exception {
Config runtime = createRunnerRuntime();
Config config = createRunnerConfig();
ILauncher launcher = Runtime.launcherClassInstance(runtime);
LaunchRunner launchRunner = new LaunchRunner(config, runtime);
SchedulerStateManagerAdaptor statemgr = Runtime.schedulerStateManagerAdaptor(runtime);
when(statemgr.setTopology(any(TopologyAPI.Topology.class), eq(TOPOLOGY_NAME))).thenReturn(false);
try {
launchRunner.call();
} finally {
verify(launcher, never()).launch(any(PackingPlan.class));
}
}
use of org.apache.heron.spi.statemgr.SchedulerStateManagerAdaptor in project heron by twitter.
the class RuntimeManagerRunnerTest method testRestartTopologyHandlerFailDeleteTManagerLoc.
@Test(expected = TopologyRuntimeManagementException.class)
public void testRestartTopologyHandlerFailDeleteTManagerLoc() {
ISchedulerClient client = mock(ISchedulerClient.class);
SchedulerStateManagerAdaptor adaptor = mock(SchedulerStateManagerAdaptor.class);
RuntimeManagerRunner runner = newRuntimeManagerRunner(Command.RESTART, client);
// Restart container 1, not containing TManager
Scheduler.RestartTopologyRequest restartTopologyRequest = Scheduler.RestartTopologyRequest.newBuilder().setTopologyName(TOPOLOGY_NAME).setContainerIndex(1).build();
when(config.getIntegerValue(Key.TOPOLOGY_CONTAINER_ID)).thenReturn(1);
// Restart container 0, containing TManager
when(config.getIntegerValue(Key.TOPOLOGY_CONTAINER_ID)).thenReturn(0);
when(runtime.get(Key.SCHEDULER_STATE_MANAGER_ADAPTOR)).thenReturn(adaptor);
when(adaptor.deleteTManagerLocation(TOPOLOGY_NAME)).thenReturn(false);
try {
runner.restartTopologyHandler(TOPOLOGY_NAME);
} finally {
// DeleteTManagerLocation should be invoked
verify(adaptor).deleteTManagerLocation(TOPOLOGY_NAME);
}
}
use of org.apache.heron.spi.statemgr.SchedulerStateManagerAdaptor in project heron by twitter.
the class RuntimeManagerRunnerTest method testRestartTopologyHandlerSuccRestartTopology.
@Test
public void testRestartTopologyHandlerSuccRestartTopology() {
ISchedulerClient client = mock(ISchedulerClient.class);
SchedulerStateManagerAdaptor adaptor = mock(SchedulerStateManagerAdaptor.class);
RuntimeManagerRunner runner = newRuntimeManagerRunner(Command.RESTART, client);
// Restart container 1, not containing TManager
Scheduler.RestartTopologyRequest restartTopologyRequest = Scheduler.RestartTopologyRequest.newBuilder().setTopologyName(TOPOLOGY_NAME).setContainerIndex(1).build();
when(config.getIntegerValue(Key.TOPOLOGY_CONTAINER_ID)).thenReturn(1);
// Success case
when(client.restartTopology(restartTopologyRequest)).thenReturn(true);
runner.restartTopologyHandler(TOPOLOGY_NAME);
// Should not invoke DeleteTManagerLocation
verify(adaptor, never()).deleteTManagerLocation(TOPOLOGY_NAME);
}
use of org.apache.heron.spi.statemgr.SchedulerStateManagerAdaptor in project heron by twitter.
the class RuntimeManagerRunnerTest method doupdateTopologyComponentParallelismTest.
private void doupdateTopologyComponentParallelismTest(String newParallelism, boolean expectedResult) {
ISchedulerClient client = mock(ISchedulerClient.class);
SchedulerStateManagerAdaptor manager = mock(SchedulerStateManagerAdaptor.class);
RuntimeManagerRunner runner = newRuntimeManagerRunner(Command.UPDATE, client);
PowerMockito.mockStatic(Runtime.class);
PowerMockito.when(Runtime.schedulerStateManagerAdaptor(runtime)).thenReturn(manager);
RoundRobinPacking packing = new RoundRobinPacking();
PackingPlans.PackingPlan currentPlan = PackingTestUtils.testProtoPackingPlan(TOPOLOGY_NAME, packing);
PackingPlans.PackingPlan proposedPlan = PackingTestUtils.testProtoPackingPlan(TOPOLOGY_NAME, packing);
Map<String, Integer> changeRequests = runner.parseNewParallelismParam(newParallelism);
when(manager.getPackingPlan(eq(TOPOLOGY_NAME))).thenReturn(currentPlan);
doReturn(proposedPlan).when(runner).buildNewPackingPlan(eq(currentPlan), eq(changeRequests), any(), any(TopologyAPI.Topology.class));
Scheduler.UpdateTopologyRequest updateTopologyRequest = Scheduler.UpdateTopologyRequest.newBuilder().setCurrentPackingPlan(currentPlan).setProposedPackingPlan(proposedPlan).build();
when(client.updateTopology(updateTopologyRequest)).thenReturn(true);
try {
runner.updateTopologyComponentParallelism(TOPOLOGY_NAME, newParallelism);
} finally {
int expectedClientUpdateCalls = expectedResult ? 1 : 0;
verify(client, times(expectedClientUpdateCalls)).updateTopology(updateTopologyRequest);
}
}
Aggregations