use of com.netflix.titus.api.jobmanager.model.job.event.TaskUpdateEvent in project titus-control-plane by Netflix.
the class JobUtil method loadActiveJobsAndTasks.
public static Pair<Map<String, Job>, Map<String, Map<String, Task>>> loadActiveJobsAndTasks(CommandContext context) {
Map<String, Job> activeJobs = new HashMap<>();
Map<String, Map<String, Task>> activeTasks = new HashMap<>();
Iterator<JobManagerEvent<?>> it = context.getJobManagementClient().observeJobs(Collections.emptyMap()).toIterable().iterator();
while (it.hasNext()) {
JobManagerEvent<?> event = it.next();
if (event instanceof JobUpdateEvent) {
JobUpdateEvent je = (JobUpdateEvent) event;
Job job = je.getCurrent();
if (job.getStatus().getState() == JobState.Accepted) {
activeJobs.put(job.getId(), job);
}
} else if (event instanceof TaskUpdateEvent) {
TaskUpdateEvent te = (TaskUpdateEvent) event;
Task task = te.getCurrent();
if (activeJobs.containsKey(task.getJobId())) {
activeTasks.computeIfAbsent(task.getJobId(), j -> new HashMap<>()).put(task.getId(), task);
}
} else if (event.equals(JobManagerEvent.snapshotMarker())) {
break;
}
}
return Pair.of(activeJobs, activeTasks);
}
use of com.netflix.titus.api.jobmanager.model.job.event.TaskUpdateEvent in project titus-control-plane by Netflix.
the class StreamDataReplicatorPerf method main.
public static void main(String[] args) throws InterruptedException {
TitusRuntime titusRuntime = TitusRuntimes.internal();
JobManagementClient client = Mockito.mock(JobManagementClient.class);
JobConnectorConfiguration configuration = Mockito.mock(JobConnectorConfiguration.class);
Mockito.when(client.observeJobs(ArgumentMatchers.any())).thenAnswer(invocation -> Flux.defer(() -> {
JobManagerEvent jobUpdateEvent = JobUpdateEvent.newJob(JOB, JobManagerConstants.GRPC_REPLICATOR_CALL_METADATA);
JobManagerEvent taskUpdateEvent = TaskUpdateEvent.newTask(JOB, TASK, JobManagerConstants.GRPC_REPLICATOR_CALL_METADATA);
return Flux.just(jobUpdateEvent, JobManagerEvent.snapshotMarker()).concatWith(Flux.interval(Duration.ofSeconds(1)).take(1).map(tick -> taskUpdateEvent)).concatWith(Flux.interval(Duration.ofSeconds(1)).take(1).flatMap(tick -> Flux.error(new RuntimeException("Simulated error"))));
}));
JobDataReplicator replicator = new JobDataReplicatorProvider(configuration, client, JobSnapshotFactories.newDefault(titusRuntime), titusRuntime).get();
replicator.events().subscribe(System.out::println);
Thread.sleep(3600_000);
}
use of com.netflix.titus.api.jobmanager.model.job.event.TaskUpdateEvent in project titus-control-plane by Netflix.
the class DefaultV3JobOperations method toJobManagerEvent.
private List<JobManagerEvent<?>> toJobManagerEvent(Predicate<Pair<Job<?>, List<Task>>> jobsPredicate, Predicate<Pair<Job<?>, Task>> tasksPredicate, boolean withCheckpoints, JobManagerReconcilerEvent event) {
if (event instanceof JobCheckpointReconcilerEvent) {
if (withCheckpoints) {
JobCheckpointReconcilerEvent checkpoint = (JobCheckpointReconcilerEvent) event;
return Collections.singletonList(JobManagerEvent.keepAliveEvent(checkpoint.getTimestampNano()));
}
return Collections.emptyList();
}
if (event instanceof JobNewModelReconcilerEvent) {
JobNewModelReconcilerEvent newModelEvent = (JobNewModelReconcilerEvent) event;
return toNewJobUpdateEvent(newModelEvent, jobsPredicate);
}
if (!(event instanceof JobModelUpdateReconcilerEvent)) {
return Collections.emptyList();
}
JobModelUpdateReconcilerEvent modelUpdateEvent = (JobModelUpdateReconcilerEvent) event;
if (modelUpdateEvent.getModelActionHolder().getModel() != Model.Reference) {
return Collections.emptyList();
}
if (modelUpdateEvent.getChangedEntityHolder().getEntity() instanceof Job) {
// We have to emit for this case both task archived event followed by job update event.
if (modelUpdateEvent.getChangeAction().getTrigger() == Trigger.ReconcilerServiceTaskRemoved) {
Task archivedTask = modelUpdateEvent.getChangeAction().getTask().orElse(null);
if (archivedTask != null) {
Job<?> job = modelUpdateEvent.getJob();
TaskUpdateEvent archiveEvent = TaskUpdateEvent.taskArchived(job, archivedTask, modelUpdateEvent.getCallMetadata());
List<JobManagerEvent<?>> events = new ArrayList<>();
events.add(archiveEvent);
events.addAll(toJobUpdateEvent(modelUpdateEvent, jobsPredicate));
return events;
}
}
return toJobUpdateEvent(modelUpdateEvent, jobsPredicate);
}
return toTaskUpdateEvent(modelUpdateEvent, tasksPredicate);
}
use of com.netflix.titus.api.jobmanager.model.job.event.TaskUpdateEvent in project titus-control-plane by Netflix.
the class TaskHelpers method isStateTransition.
static boolean isStateTransition(TaskUpdateEvent event) {
final Task currentTask = event.getCurrentTask();
final Optional<Task> previousTask = event.getPreviousTask();
boolean identical = previousTask.map(previous -> previous == currentTask).orElse(false);
return !identical && previousTask.map(previous -> !previous.getStatus().getState().equals(currentTask.getStatus().getState())).orElse(false);
}
use of com.netflix.titus.api.jobmanager.model.job.event.TaskUpdateEvent in project titus-control-plane by Netflix.
the class GrpcJobReplicatorEventStreamTest method testCacheTaskMove.
@Test
public void testCacheTaskMove() {
Pair<Job, List<Task>> pair = jobServiceStub.createJobAndTasks(SERVICE_JOB);
Job target = jobServiceStub.createJob(SERVICE_JOB);
Task task = pair.getRight().get(0);
String sourceJobId = pair.getLeft().getId();
String targetJobId = target.getId();
List<ReplicatorEvent<JobSnapshot, JobManagerEvent<?>>> events = new ArrayList<>();
newConnectVerifier().assertNext(next -> assertThat(next.getSnapshot().getTaskMap().values()).allSatisfy(t -> assertThat(t.getStatus().getState()).isEqualTo(TaskState.Accepted))).then(() -> jobServiceStub.moveTaskToState(task, TaskState.Started)).assertNext(next -> {
JobSnapshot snapshot = next.getSnapshot();
Optional<Pair<Job<?>, Task>> taskOpt = snapshot.findTaskById(task.getId());
assertThat(taskOpt).isPresent();
assertThat(taskOpt.get().getRight().getStatus().getState()).isEqualTo(TaskState.Started);
assertThat(snapshot.getTasks(sourceJobId)).containsKey(task.getId());
}).then(() -> jobServiceStub.getJobOperations().moveServiceTask(sourceJobId, targetJobId, task.getId(), CallMetadata.newBuilder().withCallerId("Test").withCallReason("testing").build()).test().awaitTerminalEvent().assertNoErrors()).recordWith(() -> events).thenConsumeWhile(next -> {
JobManagerEvent<?> trigger = next.getTrigger();
if (!(trigger instanceof TaskUpdateEvent)) {
return true;
}
TaskUpdateEvent taskUpdateEvent = (TaskUpdateEvent) trigger;
return !taskUpdateEvent.isMovedFromAnotherJob();
}).thenCancel().verify();
assertThat(events).hasSize(3);
events.stream().map(ReplicatorEvent::getTrigger).forEach(jobManagerEvent -> {
if (jobManagerEvent instanceof JobUpdateEvent) {
JobUpdateEvent jobUpdateEvent = (JobUpdateEvent) jobManagerEvent;
String eventJobId = jobUpdateEvent.getCurrent().getId();
assertThat(eventJobId).isIn(sourceJobId, targetJobId);
} else if (jobManagerEvent instanceof TaskUpdateEvent) {
TaskUpdateEvent taskUpdateEvent = (TaskUpdateEvent) jobManagerEvent;
assertThat(taskUpdateEvent.isMovedFromAnotherJob()).isTrue();
assertThat(taskUpdateEvent.getCurrentJob().getId()).isEqualTo(targetJobId);
assertThat(taskUpdateEvent.getCurrent().getJobId()).isEqualTo(targetJobId);
assertThat(taskUpdateEvent.getCurrent().getTaskContext().get(TaskAttributes.TASK_ATTRIBUTES_MOVED_FROM_JOB)).isEqualTo(sourceJobId);
} else {
fail("Unexpected event type: %s", jobManagerEvent);
}
});
}
Aggregations