use of com.netflix.titus.grpc.protogen.Task in project titus-control-plane by Netflix.
the class DefaultJobManagementServiceGrpc method findTask.
@Override
public void findTask(TaskId request, StreamObserver<Task> responseObserver) {
String id = request.getId();
try {
Pair<com.netflix.titus.api.jobmanager.model.job.Job<?>, com.netflix.titus.api.jobmanager.model.job.Task> coreJobAndTask = jobOperations.findTaskById(id).orElse(null);
if (coreJobAndTask == null) {
safeOnError(logger, JobManagerException.taskNotFound(id), responseObserver);
} else {
com.netflix.titus.api.jobmanager.model.job.Task coreTask = coreJobAndTask.getRight();
Task grpcTask = grpcObjectsCache.getTask(coreTask);
responseObserver.onNext(grpcTask);
responseObserver.onCompleted();
}
} catch (Exception e) {
safeOnError(logger, e, responseObserver);
}
}
use of com.netflix.titus.grpc.protogen.Task in project titus-control-plane by Netflix.
the class AggregatingJobServiceGatewayTest method findTaskWithFailingCell.
@Test
public void findTaskWithFailingCell() {
Random random = new Random();
List<Task> cellOneSnapshot = new ArrayList<>(dataGenerator.newServiceJobWithTasks());
cellOne.getServiceRegistry().addService(new CellWithFixedTasksService(cellOneSnapshot));
cellTwo.getServiceRegistry().addService(new CellWithFailingJobManagementService(DEADLINE_EXCEEDED));
Task expected = withStackName(cellOneSnapshot.get(random.nextInt(cellOneSnapshot.size())));
AssertableSubscriber<Task> testSubscriber = service.findTask(expected.getId(), UNDEFINED_CALL_METADATA).test();
testSubscriber.awaitTerminalEvent(1, TimeUnit.SECONDS);
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);
testSubscriber.assertValue(expected);
}
use of com.netflix.titus.grpc.protogen.Task in project titus-control-plane by Netflix.
the class AggregatingJobServiceGatewayTest method killTask.
@Test
public void killTask() {
Random random = new Random();
List<Task> cellOneSnapshot = new ArrayList<>(dataGenerator.newServiceJobWithTasks());
List<Task> cellTwoSnapshot = new ArrayList<>(dataGenerator.newBatchJobWithTasks());
CellWithFixedTasksService cellOneService = new CellWithFixedTasksService(cellOneSnapshot);
CellWithFixedTasksService cellTwoService = new CellWithFixedTasksService(cellTwoSnapshot);
cellOne.getServiceRegistry().addService(cellOneService);
cellTwo.getServiceRegistry().addService(cellTwoService);
Task killInCellOne = cellOneSnapshot.get(random.nextInt(cellOneSnapshot.size()));
Task killInCellTwo = cellTwoSnapshot.get(random.nextInt(cellTwoSnapshot.size()));
assertThat(cellOneService.currentTasks()).containsKey(killInCellOne.getId());
assertThat(cellTwoService.currentTasks()).containsKey(killInCellTwo.getId());
TaskKillRequest cellOneRequest = TaskKillRequest.newBuilder().setTaskId(killInCellOne.getId()).setShrink(false).build();
AssertableSubscriber<Void> testSubscriber = service.killTask(cellOneRequest, UNDEFINED_CALL_METADATA).test();
testSubscriber.awaitTerminalEvent(1, TimeUnit.SECONDS);
testSubscriber.assertNoErrors();
testSubscriber.assertNoValues();
testSubscriber.assertCompleted();
assertThat(cellOneService.currentTasks()).doesNotContainKey(killInCellOne.getId());
assertThat(cellTwoService.currentTasks()).doesNotContainKey(killInCellOne.getId());
testSubscriber.unsubscribe();
TaskKillRequest cellTwoRequest = TaskKillRequest.newBuilder().setTaskId(killInCellTwo.getId()).setShrink(false).build();
testSubscriber = service.killTask(cellTwoRequest, UNDEFINED_CALL_METADATA).test();
testSubscriber.awaitTerminalEvent(1, TimeUnit.SECONDS);
testSubscriber.assertNoErrors();
testSubscriber.assertNoValues();
testSubscriber.assertCompleted();
assertThat(cellOneService.currentTasks()).doesNotContainKey(killInCellTwo.getId());
assertThat(cellTwoService.currentTasks()).doesNotContainKey(killInCellTwo.getId());
testSubscriber.unsubscribe();
}
use of com.netflix.titus.grpc.protogen.Task in project titus-control-plane by Netflix.
the class AggregatingJobServiceGatewayWithSingleCellTest method findTasksMergesAllCellsIntoSingleResult.
@Test
public void findTasksMergesAllCellsIntoSingleResult() {
List<Task> cellSnapshot = new ArrayList<>();
// 10 jobs on each cell with TASKS_IN_GENERATED_JOBS tasks each
for (int i = 0; i < 5; i++) {
cellSnapshot.addAll(dataGenerator.newBatchJobWithTasks());
cellSnapshot.addAll(dataGenerator.newServiceJobWithTasks());
clock.advanceTime(1, TimeUnit.MINUTES);
}
cell.getServiceRegistry().addService(new CellWithFixedTasksService(cellSnapshot));
TaskQuery query = TaskQuery.newBuilder().setPage(toGrpcPage(Page.unlimited())).build();
final AssertableSubscriber<TaskQueryResult> testSubscriber = service.findTasks(query, UNDEFINED_CALL_METADATA).test();
testSubscriber.awaitTerminalEvent(1, TimeUnit.SECONDS);
testSubscriber.assertNoErrors().assertCompleted();
testSubscriber.assertValueCount(1);
final List<TaskQueryResult> results = testSubscriber.getOnNextEvents();
assertThat(results).hasSize(1);
// expect stackName to have changed
List<Task> expected = cellSnapshot.stream().sorted(JobManagerCursors.taskCursorOrderComparator()).map(this::withStackName).collect(Collectors.toList());
assertThat(results.get(0).getItemsList()).containsExactlyElementsOf(expected);
}
use of com.netflix.titus.grpc.protogen.Task in project titus-control-plane by Netflix.
the class GatewayJobServiceGateway method findTasks.
@Override
public Observable<TaskQueryResult> findTasks(TaskQuery taskQuery, CallMetadata callMetadata) {
Map<String, String> filteringCriteriaMap = taskQuery.getFilteringCriteriaMap();
Set<String> v3JobIds = new HashSet<>(StringExt.splitByComma(filteringCriteriaMap.getOrDefault("jobIds", "")));
boolean needsMigrationFilter = "true".equalsIgnoreCase(filteringCriteriaMap.getOrDefault("needsMigration", "false"));
// "needsMigration" query is served from the local job and relocation cache.
if (needsMigrationFilter) {
PageResult<Task> pageResult = needsMigrationQueryHandler.findTasks(GrpcJobQueryModelConverters.toJobQueryCriteria(taskQuery), toPage(taskQuery.getPage()));
TaskQueryResult taskQueryResult = TaskQueryResult.newBuilder().setPagination(toGrpcPagination(pageResult.getPagination())).addAllItems(taskDataInjector.injectIntoTasks(pageResult.getItems())).build();
return Observable.just(taskQueryResult);
}
Set<String> taskStates = Sets.newHashSet(StringExt.splitByComma(taskQuery.getFilteringCriteriaMap().getOrDefault("taskStates", "")));
Observable<TaskQueryResult> observable;
if (v3JobIds.isEmpty()) {
// Active task set only
observable = newActiveTaskQueryAction(taskQuery, callMetadata);
} else {
if (!taskStates.contains(TaskState.Finished.name())) {
// Active task set only
observable = newActiveTaskQueryAction(taskQuery, callMetadata);
} else {
Page page = taskQuery.getPage();
boolean nextPageByNumber = StringExt.isEmpty(page.getCursor()) && page.getPageNumber() > 0;
if (nextPageByNumber) {
// In this case we ask for active and archived tasks using a page number > 0. Because of that
// we have to fetch as much tasks from master as we can. Tasks that we do not fetch, will not be
// visible to the client.
TaskQuery largePageQuery = taskQuery.toBuilder().setPage(taskQuery.getPage().toBuilder().setPageNumber(0).setPageSize(gatewayConfiguration.getMaxTaskPageSize())).build();
observable = newActiveTaskQueryAction(largePageQuery, callMetadata);
} else {
observable = newActiveTaskQueryAction(taskQuery, callMetadata);
}
observable = observable.flatMap(result -> retrieveArchivedTasksForJobs(v3JobIds, taskQuery).map(archivedTasks -> combineTaskResults(taskQuery, result, archivedTasks)));
}
}
return observable.timeout(tunablesConfiguration.getRequestTimeoutMs(), TimeUnit.MILLISECONDS).map(queryResult -> taskDataInjector.injectIntoTaskQueryResult(queryResult));
}
Aggregations