@JsonProperty("id") public String getTaskId() { return taskStatus.getId(); }
private TaskStuff(Task task, TaskStatus status, DateTime createdDate, String dataSource) { Preconditions.checkArgument(task.getId().equals(status.getId())); this.task = Preconditions.checkNotNull(task, "task"); this.status = Preconditions.checkNotNull(status, "status"); this.createdDate = Preconditions.checkNotNull(createdDate, "createdDate"); this.dataSource = Preconditions.checkNotNull(dataSource, "dataSource"); }
public Map<String, TaskAnnouncement> getRunningTasks() { Map<String, TaskAnnouncement> retVal = new HashMap<>(); for (TaskAnnouncement taskAnnouncement : Lists.transform( statusCache.getCurrentData(), cacheConverter )) { retVal.put(taskAnnouncement.getTaskStatus().getId(), taskAnnouncement); } return retVal; }
@Override public void setStatus(final TaskStatus status) { Preconditions.checkNotNull(status, "status"); log.info("Updating task %s to status: %s", status.getId(), status); final boolean set = handler.setStatus( status.getId(), status.isRunnable(), status ); if (!set) { throw new ISE("Active task not found: %s", status.getId()); } }
@Override public int hashCode() { return java.util.Objects.hash(getId(), status, getDuration(), getErrorMsg()); } }
@Override public void setStatus(TaskStatus status) { giant.lock(); try { Preconditions.checkNotNull(status, "status"); final String taskid = status.getId(); Preconditions.checkState(tasks.containsKey(taskid), "Task ID must already be present: %s", taskid); Preconditions.checkState(tasks.get(taskid).getStatus().isRunnable(), "Task status must be runnable: %s", taskid); log.info("Updating task %s to status: %s", taskid, status); tasks.put(taskid, tasks.get(taskid).withStatus(status)); } finally { giant.unlock(); } }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } TaskStatus that = (TaskStatus) o; return getDuration() == that.getDuration() && java.util.Objects.equals(getId(), that.getId()) && status == that.status && java.util.Objects.equals(getErrorMsg(), that.getErrorMsg()); }
@JsonCreator private TaskAnnouncement( @JsonProperty("id") String taskId, @JsonProperty("type") String taskType, @JsonProperty("status") TaskState status, @JsonProperty("taskStatus") TaskStatus taskStatus, @JsonProperty("taskResource") TaskResource taskResource, @JsonProperty("taskLocation") TaskLocation taskLocation, @JsonProperty("taskDataSource") String taskDataSource ) { this.taskType = taskType; if (taskStatus != null) { this.taskStatus = taskStatus; } else { // Can be removed when backwards compat is no longer needed this.taskStatus = TaskStatus.fromCode(taskId, status); } this.taskResource = taskResource == null ? new TaskResource(this.taskStatus.getId(), 1) : taskResource; this.taskLocation = taskLocation == null ? TaskLocation.unknown() : taskLocation; this.taskDataSource = taskDataSource; }
@Override public void onSuccess(final TaskStatus status) { log.info("Received %s status for task: %s", status.getStatusCode(), status.getId()); handleStatus(status); }
public void updateTaskStatusAnnouncement(TaskAnnouncement announcement) throws Exception { synchronized (lock) { if (!started) { return; } CuratorUtils.createOrSet( curatorFramework, getStatusPathForId(announcement.getTaskStatus().getId()), CreateMode.PERSISTENT, jsonMapper.writeValueAsBytes(announcement), config.getMaxZnodeBytes() ); } }
public static TaskAnnouncement create( String taskId, String taskType, TaskResource resource, TaskStatus status, TaskLocation location, String taskDataSource ) { Preconditions.checkArgument(status.getId().equals(taskId), "task id == status id"); return new TaskAnnouncement(null, taskType, null, status, resource, location, taskDataSource); }
@Override public void insert(Task task, TaskStatus status) throws EntryExistsException { giant.lock(); try { Preconditions.checkNotNull(task, "task"); Preconditions.checkNotNull(status, "status"); Preconditions.checkArgument( task.getId().equals(status.getId()), "Task/Status ID mismatch[%s/%s]", task.getId(), status.getId() ); if (tasks.containsKey(task.getId())) { throw new EntryExistsException(task.getId()); } log.info("Inserting task %s with status: %s", task.getId(), status); tasks.put(task.getId(), new TaskStuff(task, status, DateTimes.nowUtc(), task.getDataSource())); } finally { giant.unlock(); } }
public static void setTaskStatusDimensions( final ServiceMetricEvent.Builder metricBuilder, final TaskStatus taskStatus ) { metricBuilder.setDimension(DruidMetrics.TASK_ID, taskStatus.getId()); metricBuilder.setDimension(DruidMetrics.TASK_STATUS, taskStatus.getStatusCode().toString()); } }
private void taskComplete( HttpRemoteTaskRunnerWorkItem taskRunnerWorkItem, WorkerHolder workerHolder, TaskStatus taskStatus ) { Preconditions.checkState(!Thread.holdsLock(statusLock), "Current thread must not hold statusLock."); Preconditions.checkNotNull(taskRunnerWorkItem, "taskRunnerWorkItem"); Preconditions.checkNotNull(taskStatus, "taskStatus"); if (workerHolder != null) { log.info( "Worker[%s] completed task[%s] with status[%s]", workerHolder.getWorker().getHost(), taskStatus.getId(), taskStatus.getStatusCode() ); // Worker is done with this task workerHolder.setLastCompletedTaskTime(DateTimes.nowUtc()); } // Notify interested parties taskRunnerWorkItem.setResult(taskStatus); TaskRunnerUtils.notifyStatusChanged(listeners, taskStatus.getId(), taskStatus); // Update success/failure counters, Blacklist node if there are too many failures. if (workerHolder != null) { blacklistWorkerIfNeeded(taskStatus, workerHolder); } synchronized (statusLock) { statusLock.notifyAll(); } }
@Override public void insert(final Task task, final TaskStatus status) throws EntryExistsException { Preconditions.checkNotNull(task, "task"); Preconditions.checkNotNull(status, "status"); Preconditions.checkArgument( task.getId().equals(status.getId()), "Task/Status ID mismatch[%s/%s]", task.getId(), status.getId() ); log.info("Inserting task %s with status: %s", task.getId(), status); try { handler.insert( task.getId(), DateTimes.nowUtc(), task.getDataSource(), task, status.isRunnable(), status ); } catch (Exception e) { if (e instanceof EntryExistsException) { throw (EntryExistsException) e; } else { Throwables.propagate(e); } } }
@Test public void testRestartRemoteTaskRunner() throws Exception { doSetup(); remoteTaskRunner.run(task); Assert.assertTrue(taskAnnounced(task.getId())); mockWorkerRunningTask(task); Assert.assertTrue(workerRunningTask(task.getId())); remoteTaskRunner.stop(); makeRemoteTaskRunner(new TestRemoteTaskRunnerConfig(new Period("PT5S"))); final RemoteTaskRunnerWorkItem newWorkItem = remoteTaskRunner .getKnownTasks() .stream() .filter(workItem -> workItem.getTaskId().equals(task.getId())) .findFirst() .orElse(null); final ListenableFuture<TaskStatus> result = newWorkItem.getResult(); mockWorkerCompleteSuccessfulTask(task); Assert.assertTrue(workerCompletedTask(result)); Assert.assertEquals(task.getId(), result.get().getId()); Assert.assertEquals(TaskState.SUCCESS, result.get().getStatusCode()); }
@Test public void testRun() throws Exception { doSetup(); ListenableFuture<TaskStatus> result = remoteTaskRunner.run(task); Assert.assertTrue(taskAnnounced(task.getId())); mockWorkerRunningTask(task); Assert.assertTrue(workerRunningTask(task.getId())); mockWorkerCompleteSuccessfulTask(task); Assert.assertTrue(workerCompletedTask(result)); Assert.assertEquals(task.getId(), result.get().getId()); Assert.assertEquals(TaskState.SUCCESS, result.get().getStatusCode()); }
@Test public void testWorkerDisabled() throws Exception { doSetup(); final ListenableFuture<TaskStatus> result = remoteTaskRunner.run(task); Assert.assertTrue(taskAnnounced(task.getId())); mockWorkerRunningTask(task); Assert.assertTrue(workerRunningTask(task.getId())); // Disable while task running disableWorker(); // Continue test mockWorkerCompleteSuccessfulTask(task); Assert.assertTrue(workerCompletedTask(result)); Assert.assertEquals(task.getId(), result.get().getId()); Assert.assertEquals(TaskState.SUCCESS, result.get().getStatusCode()); // Confirm RTR thinks the worker is disabled. Assert.assertEquals("", Iterables.getOnlyElement(remoteTaskRunner.getWorkers()).getWorker().getVersion()); }
@Test public void testRunExistingTaskThatHasStartedRunning() throws Exception { doSetup(); remoteTaskRunner.run(task); Assert.assertTrue(taskAnnounced(task.getId())); mockWorkerRunningTask(task); Assert.assertTrue(workerRunningTask(task.getId())); ListenableFuture<TaskStatus> result = remoteTaskRunner.run(task); Assert.assertFalse(result.isDone()); mockWorkerCompleteSuccessfulTask(task); Assert.assertTrue(workerCompletedTask(result)); Assert.assertEquals(task.getId(), result.get().getId()); Assert.assertEquals(TaskState.SUCCESS, result.get().getStatusCode()); }
@Test public void testRunExistingTaskThatHasntStartedRunning() throws Exception { doSetup(); remoteTaskRunner.run(task); Assert.assertTrue(taskAnnounced(task.getId())); ListenableFuture<TaskStatus> result = remoteTaskRunner.run(task); Assert.assertFalse(result.isDone()); mockWorkerRunningTask(task); Assert.assertTrue(workerRunningTask(task.getId())); mockWorkerCompleteSuccessfulTask(task); Assert.assertTrue(workerCompletedTask(result)); Assert.assertEquals(task.getId(), result.get().getId()); Assert.assertEquals(TaskState.SUCCESS, result.get().getStatusCode()); }