This is an automated email from the ASF dual-hosted git repository.

kfaraz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 8da9a1b1071 minor: Pass full Task payload in TaskRunnerListener and 
not just taskId (#20417)
8da9a1b1071 is described below

commit 8da9a1b1071327beff5d7baba9c49f68b84420e2
Author: Kashif Faraz <[email protected]>
AuthorDate: Mon Sep 28 17:15:06 2026 +0530

    minor: Pass full Task payload in TaskRunnerListener and not just taskId 
(#20417)
    
    Changes:
    - Pass `Task` payload in `TaskRunnerListener` methods `locationChanged` and 
`statusChanged`
    - This allows listeners (particularly in extensions) to take better 
decisions on these notifications
    as they can now extract the task type, datasource and other info of the 
tasks.
    - Fix `HttpRemoteTaskRunner` to fetch both `TaskStatus` and `Task` payload 
from metadata store
    when it discovers a new task from one of the workers
---
 .../druid/k8s/overlord/KubernetesTaskRunner.java   |  4 +-
 .../overlord/MultipleKubernetesTaskRunnerTest.java |  4 +-
 .../compact/OverlordCompactionScheduler.java       | 13 ++--
 .../overlord/BaseRestorableTaskRunner.java         | 10 ++-
 .../druid/indexing/overlord/ForkingTaskRunner.java | 22 ++++++-
 .../overlord/SingleTaskBackgroundRunner.java       | 14 ++---
 .../indexing/overlord/TaskRunnerListener.java      |  5 +-
 .../druid/indexing/overlord/TaskRunnerUtils.java   | 23 ++++---
 .../indexing/overlord/ThreadingTaskRunner.java     | 22 ++++++-
 .../overlord/hrtr/HttpRemoteTaskRunner.java        | 29 +++++----
 .../scheduledbatch/ScheduledBatchTaskManager.java  |  7 ++-
 .../supervisor/SeekableStreamSupervisor.java       |  4 +-
 .../druid/indexing/worker/WorkerTaskManager.java   |  6 +-
 .../overlord/SingleTaskBackgroundRunnerTest.java   |  9 +--
 .../druid/indexing/overlord/TestTaskRunner.java    | 14 ++---
 .../overlord/hrtr/HttpRemoteTaskRunnerTest.java    | 71 ++++++++++++++++++++--
 16 files changed, 185 insertions(+), 72 deletions(-)

diff --git 
a/extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/KubernetesTaskRunner.java
 
b/extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/KubernetesTaskRunner.java
index fa7148a6151..9d7254d193d 100644
--- 
a/extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/KubernetesTaskRunner.java
+++ 
b/extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/KubernetesTaskRunner.java
@@ -333,13 +333,13 @@ public class KubernetesTaskRunner implements 
TaskLogStreamer, TaskRunner
   @Override
   public void updateStatus(Task task, TaskStatus status)
   {
-    TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), status);
+    TaskRunnerUtils.notifyStatusChanged(listeners, task, status);
   }
 
   @Override
   public void updateLocation(Task task, TaskLocation location)
   {
-    TaskRunnerUtils.notifyLocationChanged(listeners, task.getId(), location);
+    TaskRunnerUtils.notifyLocationChanged(listeners, task, location);
   }
 
   @Override
diff --git 
a/extensions-core/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/MultipleKubernetesTaskRunnerTest.java
 
b/extensions-core/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/MultipleKubernetesTaskRunnerTest.java
index 2033b23fb60..26212181cd7 100644
--- 
a/extensions-core/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/MultipleKubernetesTaskRunnerTest.java
+++ 
b/extensions-core/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/MultipleKubernetesTaskRunnerTest.java
@@ -1069,13 +1069,13 @@ public class MultipleKubernetesTaskRunnerTest extends 
EasyMockSupport
           }
 
           @Override
-          public void locationChanged(String taskId, TaskLocation newLocation)
+          public void locationChanged(Task task, TaskLocation newLocation)
           {
 
           }
 
           @Override
-          public void statusChanged(String taskId, TaskStatus status)
+          public void statusChanged(Task task, TaskStatus status)
           {
 
           }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
index c2a0dabb65a..647b5774513 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
@@ -29,6 +29,7 @@ import org.apache.druid.error.DruidException;
 import org.apache.druid.indexer.TaskLocation;
 import org.apache.druid.indexer.TaskStatus;
 import org.apache.druid.indexing.common.actions.TaskActionClientFactory;
+import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.overlord.GlobalTaskLockbox;
 import org.apache.druid.indexing.overlord.TaskMaster;
 import org.apache.druid.indexing.overlord.TaskQueryTool;
@@ -198,16 +199,16 @@ public class OverlordCompactionScheduler implements 
CompactionScheduler
       }
 
       @Override
-      public void locationChanged(String taskId, TaskLocation newLocation)
+      public void locationChanged(Task task, TaskLocation newLocation)
       {
         // Do nothing
       }
 
       @Override
-      public void statusChanged(String taskId, TaskStatus status)
+      public void statusChanged(Task task, TaskStatus status)
       {
         if (status.isComplete()) {
-          onTaskFinished(taskId, status);
+          onTaskFinished(task, status);
           launchPendingJobs();
         }
       }
@@ -443,12 +444,12 @@ public class OverlordCompactionScheduler implements 
CompactionScheduler
     }
   }
 
-  private void onTaskFinished(String taskId, TaskStatus taskStatus)
+  private void onTaskFinished(Task task, TaskStatus taskStatus)
   {
-    statusTracker.onTaskFinished(taskId, taskStatus);
+    statusTracker.onTaskFinished(task.getId(), taskStatus);
 
     updateQueueIfComputed(queue -> {
-      queue.onTaskFinished(taskId, taskStatus);
+      queue.onTaskFinished(task.getId(), taskStatus);
       updateCompactionSnapshots(queue);
     });
   }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/BaseRestorableTaskRunner.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/BaseRestorableTaskRunner.java
index be2008ab142..8f888cee1b1 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/BaseRestorableTaskRunner.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/BaseRestorableTaskRunner.java
@@ -152,8 +152,8 @@ public abstract class BaseRestorableTaskRunner<WorkItemType 
extends TaskRunnerWo
     final Pair<TaskRunnerListener, Executor> listenerPair = Pair.of(listener, 
executor);
 
     synchronized (tasks) {
-      for (TaskRunnerWorkItem item : tasks.values()) {
-        TaskRunnerUtils.notifyLocationChanged(ImmutableList.of(listenerPair), 
item.getTaskId(), item.getLocation());
+      for (WorkItemType item : tasks.values()) {
+        notifyLocationChanged(item, listener, executor);
       }
 
       listeners.add(listenerPair);
@@ -183,6 +183,12 @@ public abstract class 
BaseRestorableTaskRunner<WorkItemType extends TaskRunnerWo
   @Override
   public abstract RunnerTaskState getRunnerTaskState(String taskId);
 
+  protected abstract void notifyLocationChanged(
+      WorkItemType item,
+      TaskRunnerListener listener,
+      Executor executor
+  );
+
   @Override
   public Collection<TaskRunnerWorkItem> getKnownTasks()
   {
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
index 2ec1faf77b8..606f5152063 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
@@ -53,6 +53,7 @@ import org.apache.druid.indexing.worker.config.WorkerConfig;
 import org.apache.druid.java.util.common.DateTimes;
 import org.apache.druid.java.util.common.FileUtils;
 import org.apache.druid.java.util.common.ISE;
+import org.apache.druid.java.util.common.Pair;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.concurrent.Execs;
 import org.apache.druid.java.util.common.io.Closer;
@@ -87,6 +88,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -413,10 +415,10 @@ public class ForkingTaskRunner
                         processHolder.registerWithCloser(closer);
                       }
 
-                      TaskRunnerUtils.notifyLocationChanged(listeners, 
task.getId(), taskLocation);
+                      TaskRunnerUtils.notifyLocationChanged(listeners, task, 
taskLocation);
                       TaskRunnerUtils.notifyStatusChanged(
                           listeners,
-                          task.getId(),
+                          task,
                           TaskStatus.running(task.getId())
                       );
 
@@ -444,7 +446,7 @@ public class ForkingTaskRunner
                       } else {
                         failedTaskCount.incrementAndGet();
                       }
-                      TaskRunnerUtils.notifyStatusChanged(listeners, 
task.getId(), status);
+                      TaskRunnerUtils.notifyStatusChanged(listeners, task, 
status);
                       return status;
                     }
                     catch (Throwable t) {
@@ -697,6 +699,20 @@ public class ForkingTaskRunner
     }
   }
 
+  @Override
+  protected void notifyLocationChanged(
+      ForkingTaskRunnerWorkItem item,
+      TaskRunnerListener listener,
+      Executor executor
+  )
+  {
+    TaskRunnerUtils.notifyLocationChanged(
+        List.of(Pair.of(listener, executor)),
+        item.getTask(),
+        item.getLocation()
+    );
+  }
+
   @Override
   public Optional<ScalingStats> getScalingStats()
   {
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunner.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunner.java
index c16d7212868..361c431c762 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunner.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunner.java
@@ -127,7 +127,7 @@ public class SingleTaskBackgroundRunner implements 
TaskRunner, QuerySegmentWalke
     if (runningItem != null) {
       TaskRunnerUtils.notifyLocationChanged(
           ImmutableList.of(listenerPair),
-          runningItem.getTaskId(),
+          runningItem.getTask(),
           runningItem.getLocation()
       );
     }
@@ -202,7 +202,7 @@ public class SingleTaskBackgroundRunner implements 
TaskRunner, QuerySegmentWalke
               System.currentTimeMillis() - start
           );
 
-          TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), 
taskStatus);
+          TaskRunnerUtils.notifyStatusChanged(listeners, task, taskStatus);
         }
         catch (Exception e) {
           log.makeAlert(e, "Graceful task shutdown failed: %s", 
task.getDataSource())
@@ -218,7 +218,7 @@ public class SingleTaskBackgroundRunner implements 
TaskRunner, QuerySegmentWalke
           // See https://github.com/apache/druid/issues/11445.
           TaskRunnerUtils.notifyStatusChanged(
               listeners,
-              task.getId(),
+              task,
               TaskStatus.failure(
                   task.getId(),
                   "Failed to stop gracefully with exception. See task logs for 
more details."
@@ -233,7 +233,7 @@ public class SingleTaskBackgroundRunner implements 
TaskRunner, QuerySegmentWalke
         // See https://github.com/apache/druid/issues/11445.
         TaskRunnerUtils.notifyStatusChanged(
             listeners,
-            task.getId(),
+            task,
             TaskStatus.failure(task.getId(), "Canceled as task execution 
process stopped")
         );
       }
@@ -471,10 +471,10 @@ public class SingleTaskBackgroundRunner implements 
TaskRunner, QuerySegmentWalke
         log.info("Running task: %s", task.getId());
         TaskRunnerUtils.notifyLocationChanged(
             listeners,
-            task.getId(),
+            task,
             location
         );
-        TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), 
TaskStatus.running(task.getId()));
+        TaskRunnerUtils.notifyStatusChanged(listeners, task, 
TaskStatus.running(task.getId()));
         status = task.run(toolbox);
       }
       catch (InterruptedException e) {
@@ -499,7 +499,7 @@ public class SingleTaskBackgroundRunner implements 
TaskRunner, QuerySegmentWalke
       }
 
       status = status.withDuration(System.currentTimeMillis() - startTime);
-      TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), status);
+      TaskRunnerUtils.notifyStatusChanged(listeners, task, status);
       return status;
     }
   }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerListener.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerListener.java
index 23d11eaa0df..c679848e7b6 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerListener.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerListener.java
@@ -21,6 +21,7 @@ package org.apache.druid.indexing.overlord;
 
 import org.apache.druid.indexer.TaskLocation;
 import org.apache.druid.indexer.TaskStatus;
+import org.apache.druid.indexing.common.task.Task;
 
 import java.util.concurrent.Executor;
 
@@ -35,10 +36,10 @@ public interface TaskRunnerListener
    * Called when the location of a task has changed. The task may not actually 
be done starting up when
    * this notification arrives, so it may not be listening at this location 
yet.
    */
-  void locationChanged(String taskId, TaskLocation newLocation);
+  void locationChanged(Task task, TaskLocation newLocation);
 
   /**
    * Called when the status of a task has changed.
    */
-  void statusChanged(String taskId, TaskStatus status);
+  void statusChanged(Task task, TaskStatus status);
 }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerUtils.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerUtils.java
index c2311a63351..99d838aee85 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerUtils.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/TaskRunnerUtils.java
@@ -26,7 +26,9 @@ import io.netty.handler.codec.http.HttpMethod;
 import io.netty.handler.codec.http.HttpResponseStatus;
 import org.apache.druid.indexer.TaskLocation;
 import org.apache.druid.indexer.TaskStatus;
+import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.worker.Worker;
+import org.apache.druid.java.util.common.IOE;
 import org.apache.druid.java.util.common.Pair;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.emitter.EmittingLogger;
@@ -51,18 +53,18 @@ public class TaskRunnerUtils
 
   public static void notifyLocationChanged(
       final Iterable<Pair<TaskRunnerListener, Executor>> listeners,
-      final String taskId,
+      final Task task,
       final TaskLocation location
   )
   {
-    log.debug("Task [%s] location changed to [%s].", taskId, location);
+    log.debug("Task [%s] location changed to [%s].", task.getId(), location);
     for (final Pair<TaskRunnerListener, Executor> listener : listeners) {
       try {
-        listener.rhs.execute(() -> listener.lhs.locationChanged(taskId, 
location));
+        listener.rhs.execute(() -> listener.lhs.locationChanged(task, 
location));
       }
       catch (Exception e) {
         log.makeAlert(e, "Unable to notify task listener")
-           .addData("taskId", taskId)
+           .addData("taskId", task.getId())
            .addData("taskLocation", location)
            .addData("listener", listener.toString())
            .emit();
@@ -72,18 +74,18 @@ public class TaskRunnerUtils
 
   public static void notifyStatusChanged(
       final Iterable<Pair<TaskRunnerListener, Executor>> listeners,
-      final String taskId,
+      final Task task,
       final TaskStatus status
   )
   {
-    log.debug("Task [%s] status changed to [%s].", taskId, 
status.getStatusCode());
+    log.debug("Task [%s] status changed to [%s].", task.getId(), 
status.getStatusCode());
     for (final Pair<TaskRunnerListener, Executor> listener : listeners) {
       try {
-        listener.rhs.execute(() -> listener.lhs.statusChanged(taskId, status));
+        listener.rhs.execute(() -> listener.lhs.statusChanged(task, status));
       }
       catch (Exception e) {
         log.makeAlert(e, "Unable to notify task listener")
-           .addData("taskId", taskId)
+           .addData("taskId", task.getId())
            .addData("taskStatus", status.getStatusCode())
            .addData("listener", listener.toString())
            .emit();
@@ -141,8 +143,9 @@ public class TaskRunnerUtils
                  || 
HttpResponseStatus.SERVICE_UNAVAILABLE.equals(responseStatus)) {
         return Optional.absent();
       } else {
-        throw new IOException(
-            StringUtils.format("Failed to stream task reports from [%s]. 
Response status [%s].", url, responseStatus)
+        throw new IOE(
+            "Failed to stream task reports from url[%s]. Response status[%s].",
+            url, responseStatus
         );
       }
     }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ThreadingTaskRunner.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ThreadingTaskRunner.java
index 92f577a8f46..999e36a3dd3 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ThreadingTaskRunner.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ThreadingTaskRunner.java
@@ -46,6 +46,7 @@ import org.apache.druid.indexing.worker.config.WorkerConfig;
 import org.apache.druid.java.util.common.DateTimes;
 import org.apache.druid.java.util.common.FileUtils;
 import org.apache.druid.java.util.common.ISE;
+import org.apache.druid.java.util.common.Pair;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.concurrent.Execs;
 import org.apache.druid.java.util.emitter.EmittingLogger;
@@ -72,6 +73,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Callable;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
@@ -225,10 +227,10 @@ public class ThreadingTaskRunner
                                                 
.withTmpStorageBytesPerTask(storageSlot.getNumBytes()),
                                 task
                             );
-                            TaskRunnerUtils.notifyLocationChanged(listeners, 
task.getId(), taskLocation);
+                            TaskRunnerUtils.notifyLocationChanged(listeners, 
task, taskLocation);
                             TaskRunnerUtils.notifyStatusChanged(
                                 listeners,
-                                task.getId(),
+                                task,
                                 TaskStatus.running(task.getId())
                             );
 
@@ -264,7 +266,7 @@ public class ThreadingTaskRunner
                               
Appenderators.clearTaskThreadContextForIndexers();
                             }
 
-                            TaskRunnerUtils.notifyStatusChanged(listeners, 
task.getId(), taskStatus);
+                            TaskRunnerUtils.notifyStatusChanged(listeners, 
task, taskStatus);
                             return taskStatus;
                           }
                           catch (Throwable t) {
@@ -476,6 +478,20 @@ public class ThreadingTaskRunner
     return workItem == null ? null : workItem.getState();
   }
 
+  @Override
+  protected void notifyLocationChanged(
+      ThreadingTaskRunnerWorkItem item,
+      TaskRunnerListener listener,
+      Executor executor
+  )
+  {
+    TaskRunnerUtils.notifyLocationChanged(
+        List.of(Pair.of(listener, executor)),
+        item.getTask(),
+        item.getLocation()
+    );
+  }
+
   private Collection<TaskRunnerWorkItem> getTasks(RunnerTaskState state)
   {
     synchronized (tasks) {
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunner.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunner.java
index b237b6577ae..24f0fe12752 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunner.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunner.java
@@ -413,7 +413,7 @@ public class HttpRemoteTaskRunner implements 
WorkerTaskRunner, TaskLogStreamer,
     } else {
       // Notify interested parties
       taskRunnerWorkItem.setResult(taskStatus);
-      TaskRunnerUtils.notifyStatusChanged(listeners, taskStatus.getId(), 
taskStatus);
+      TaskRunnerUtils.notifyStatusChanged(listeners, taskRunnerWorkItem.task, 
taskStatus);
 
       // Update success/failure counters, Blacklist node if there are too many 
failures.
       if (workerHolder != null) {
@@ -1004,7 +1004,7 @@ public class HttpRemoteTaskRunner implements 
WorkerTaskRunner, TaskLogStreamer,
         if (entry.getValue().getState() == 
HttpRemoteTaskRunnerWorkItem.State.RUNNING) {
           TaskRunnerUtils.notifyLocationChanged(
               ImmutableList.of(listenerPair),
-              entry.getKey(),
+              entry.getValue().getTask(),
               entry.getValue().getLocation()
           );
         }
@@ -1442,11 +1442,21 @@ public class HttpRemoteTaskRunner implements 
WorkerTaskRunner, TaskLogStreamer,
         if (knownStatusInStorage.isPresent()) {
           switch (knownStatusInStorage.get().getStatusCode()) {
             case RUNNING:
+              final Optional<Task> task = taskStorage.getTask(taskId);
+              if (!task.isPresent()) {
+                log.makeAlert(
+                    "Could not fetch payload of task[%s] with status[%s]."
+                    + " Ignoring notification[%s] from worker[%s].",
+                    taskId, knownStatusInStorage.get(), announcement, 
worker.getHost()
+                ).emit();
+                break;
+              }
+
               taskItem = new HttpRemoteTaskRunnerWorkItem(
                   taskId,
                   worker,
                   TaskLocation.unknown(),
-                  null,
+                  task.get(),
                   announcement.getTaskType(),
                   HttpRemoteTaskRunnerWorkItem.State.RUNNING
               );
@@ -1516,7 +1526,7 @@ public class HttpRemoteTaskRunner implements 
WorkerTaskRunner, TaskLogStreamer,
                         announcement.getTaskLocation()
                     );
                     taskItem.setLocation(announcement.getTaskLocation());
-                    TaskRunnerUtils.notifyLocationChanged(listeners, taskId, 
announcement.getTaskLocation());
+                    TaskRunnerUtils.notifyLocationChanged(listeners, 
taskItem.getTask(), announcement.getTaskLocation());
                   }
                 } else {
                   log.warn(
@@ -1565,7 +1575,7 @@ public class HttpRemoteTaskRunner implements 
WorkerTaskRunner, TaskLogStreamer,
                         announcement.getTaskLocation()
                     );
                     taskItem.setLocation(announcement.getTaskLocation());
-                    TaskRunnerUtils.notifyLocationChanged(listeners, taskId, 
announcement.getTaskLocation());
+                    TaskRunnerUtils.notifyLocationChanged(listeners, 
taskItem.getTask(), announcement.getTaskLocation());
                   }
 
                   isTaskCompleted = true;
@@ -1790,17 +1800,14 @@ public class HttpRemoteTaskRunner implements 
WorkerTaskRunner, TaskLogStreamer,
         String taskId,
         Worker worker,
         TaskLocation location,
-        @Nullable Task task,
+        Task task,
         String taskType,
         State state
     )
     {
-      super(taskId, task == null ? null : task.getType(), worker, location, 
task == null ? null : task.getDataSource());
+      super(taskId, task.getType(), worker, location, task.getDataSource());
       this.state = Preconditions.checkNotNull(state);
-      Preconditions.checkArgument(task == null || taskType == null || 
taskType.equals(task.getType()));
-
-      // It is possible to have it null when the TaskRunner is just started 
and discovered this taskId from a worker,
-      // notifications don't contain whole Task instance but just metadata 
about the task.
+      Preconditions.checkArgument(taskType == null || 
taskType.equals(task.getType()));
       this.task = task;
     }
 
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/scheduledbatch/ScheduledBatchTaskManager.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/scheduledbatch/ScheduledBatchTaskManager.java
index 860710220e2..64b9d5f978d 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/scheduledbatch/ScheduledBatchTaskManager.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/scheduledbatch/ScheduledBatchTaskManager.java
@@ -25,6 +25,7 @@ import org.apache.druid.client.broker.BrokerClient;
 import org.apache.druid.common.guava.FutureUtils;
 import org.apache.druid.indexer.TaskLocation;
 import org.apache.druid.indexer.TaskStatus;
+import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.overlord.LeaderOverlordService;
 import org.apache.druid.indexing.overlord.TaskMaster;
 import org.apache.druid.indexing.overlord.TaskRunner;
@@ -103,16 +104,16 @@ public class ScheduledBatchTaskManager implements 
LeaderOverlordService
       }
 
       @Override
-      public void locationChanged(String taskId, TaskLocation newLocation)
+      public void locationChanged(Task task, TaskLocation newLocation)
       {
         // Do nothing
       }
 
       @Override
-      public void statusChanged(final String taskId, final TaskStatus 
taskStatus)
+      public void statusChanged(final Task task, final TaskStatus taskStatus)
       {
         if (taskStatus.isComplete()) {
-          statusTracker.onTaskCompleted(taskId, taskStatus);
+          statusTracker.onTaskCompleted(task.getId(), taskStatus);
         }
       }
     };
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
index ab204a63acf..3377090a29c 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/seekablestream/supervisor/SeekableStreamSupervisor.java
@@ -2099,13 +2099,13 @@ public abstract class 
SeekableStreamSupervisor<PartitionIdType, SequenceOffsetTy
             }
 
             @Override
-            public void locationChanged(final String taskId, final 
TaskLocation newLocation)
+            public void locationChanged(final Task task, final TaskLocation 
newLocation)
             {
               // do nothing
             }
 
             @Override
-            public void statusChanged(String taskId, TaskStatus status)
+            public void statusChanged(Task task, TaskStatus status)
             {
               addNotice(new RunNotice());
             }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/worker/WorkerTaskManager.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/worker/WorkerTaskManager.java
index 996831badba..cea63c937ac 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/worker/WorkerTaskManager.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/worker/WorkerTaskManager.java
@@ -240,13 +240,13 @@ public class WorkerTaskManager implements 
IndexerTaskCountStatsProvider
           }
 
           @Override
-          public void locationChanged(final String taskId, final TaskLocation 
newLocation)
+          public void locationChanged(final Task task, final TaskLocation 
newLocation)
           {
-            submitNoticeToExec(new LocationNotice(taskId, newLocation));
+            submitNoticeToExec(new LocationNotice(task.getId(), newLocation));
           }
 
           @Override
-          public void statusChanged(final String taskId, final TaskStatus 
status)
+          public void statusChanged(final Task task, final TaskStatus status)
           {
             // do nothing
           }
diff --git 
a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunnerTest.java
 
b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunnerTest.java
index 1845c38db52..0a73e82ad31 100644
--- 
a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunnerTest.java
+++ 
b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/SingleTaskBackgroundRunnerTest.java
@@ -35,6 +35,7 @@ import org.apache.druid.indexing.common.config.TaskConfig;
 import org.apache.druid.indexing.common.config.TaskConfigBuilder;
 import org.apache.druid.indexing.common.task.AbstractTask;
 import org.apache.druid.indexing.common.task.NoopTask;
+import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.common.task.TestAppenderatorsManager;
 import org.apache.druid.java.util.common.Intervals;
 import org.apache.druid.java.util.common.concurrent.Execs;
@@ -236,13 +237,13 @@ public class SingleTaskBackgroundRunnerTest
           }
 
           @Override
-          public void locationChanged(String taskId, TaskLocation newLocation)
+          public void locationChanged(Task task, TaskLocation newLocation)
           {
             // do nothing
           }
 
           @Override
-          public void statusChanged(String taskId, TaskStatus status)
+          public void statusChanged(Task task, TaskStatus status)
           {
             statusHolder.set(status);
           }
@@ -299,13 +300,13 @@ public class SingleTaskBackgroundRunnerTest
           }
 
           @Override
-          public void locationChanged(String taskId, TaskLocation newLocation)
+          public void locationChanged(Task task, TaskLocation newLocation)
           {
             // do nothing
           }
 
           @Override
-          public void statusChanged(String taskId, TaskStatus status)
+          public void statusChanged(Task task, TaskStatus status)
           {
             if (status.getStatusCode() == TaskState.RUNNING) {
               runLatch.countDown();
diff --git 
a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/TestTaskRunner.java
 
b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/TestTaskRunner.java
index 2afb2b4dae3..01523c21166 100644
--- 
a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/TestTaskRunner.java
+++ 
b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/TestTaskRunner.java
@@ -111,7 +111,7 @@ public class TestTaskRunner implements TaskRunner, 
QuerySegmentWalker
     listeners.add(listenerPair);
     log.info("Registered listener [%s]", listener.getListenerId());
     for (TestTaskRunnerWorkItem item : runningItems) {
-      TaskRunnerUtils.notifyLocationChanged(ImmutableList.of(listenerPair), 
item.getTaskId(), item.getLocation());
+      TaskRunnerUtils.notifyLocationChanged(ImmutableList.of(listenerPair), 
item.getTask(), item.getLocation());
     }
   }
 
@@ -173,15 +173,15 @@ public class TestTaskRunner implements TaskRunner, 
QuerySegmentWalker
               System.currentTimeMillis() - start
           );
 
-          TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), 
taskStatus);
+          TaskRunnerUtils.notifyStatusChanged(listeners, task, taskStatus);
         }
         catch (Exception e) {
           String errMsg = "Graceful shutdown of task aborted with exception, 
see task logs for more information";
-          TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), 
TaskStatus.failure(task.getId(), errMsg));
+          TaskRunnerUtils.notifyStatusChanged(listeners, task, 
TaskStatus.failure(task.getId(), errMsg));
           throw new RE(e, "Graceful shutdown of task[%s] aborted with 
exception", task.getId());
         }
       } else {
-        TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), 
TaskStatus.failure(
+        TaskRunnerUtils.notifyStatusChanged(listeners, task, 
TaskStatus.failure(
             task.getId(),
             "Task failure while shutting down gracefully"
         ));
@@ -405,10 +405,10 @@ public class TestTaskRunner implements TaskRunner, 
QuerySegmentWalker
         log.info("Running task: %s", task.getId());
         TaskRunnerUtils.notifyLocationChanged(
             listeners,
-            task.getId(),
+            task,
             taskLocation
         );
-        TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), 
TaskStatus.running(task.getId()));
+        TaskRunnerUtils.notifyStatusChanged(listeners, task, 
TaskStatus.running(task.getId()));
         status = task.run(toolbox);
       }
       catch (InterruptedException e) {
@@ -432,7 +432,7 @@ public class TestTaskRunner implements TaskRunner, 
QuerySegmentWalker
       }
 
       status = status.withDuration(System.currentTimeMillis() - startTime);
-      TaskRunnerUtils.notifyStatusChanged(listeners, task.getId(), status);
+      TaskRunnerUtils.notifyStatusChanged(listeners, task, status);
       return status;
     }
   }
diff --git 
a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunnerTest.java
 
b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunnerTest.java
index 8a053ecc4a5..6d965b529b9 100644
--- 
a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunnerTest.java
+++ 
b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/hrtr/HttpRemoteTaskRunnerTest.java
@@ -62,10 +62,12 @@ import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.concurrent.Execs;
 import org.apache.druid.java.util.emitter.EmittingLogger;
+import org.apache.druid.java.util.emitter.service.AlertEvent;
 import org.apache.druid.java.util.http.client.HttpClient;
 import org.apache.druid.java.util.http.client.Request;
 import 
org.apache.druid.java.util.http.client.response.InputStreamFullResponseHandler;
 import 
org.apache.druid.java.util.http.client.response.InputStreamFullResponseHolder;
+import org.apache.druid.java.util.metrics.StubServiceEmitter;
 import org.apache.druid.segment.TestHelper;
 import org.apache.druid.server.DruidNode;
 import org.apache.druid.server.coordination.ChangeRequestHttpSyncer;
@@ -101,10 +103,13 @@ import static org.easymock.EasyMock.isA;
  */
 public class HttpRemoteTaskRunnerTest
 {
+  private StubServiceEmitter emitter;
+
   @BeforeEach
   public void setup()
   {
-    EmittingLogger.registerEmitter(new NoopServiceEmitter());
+    emitter = new StubServiceEmitter();
+    EmittingLogger.registerEmitter(emitter);
   }
 
   /*
@@ -451,9 +456,15 @@ public class HttpRemoteTaskRunnerTest
     TaskStorage taskStorageMock = EasyMock.createStrictMock(TaskStorage.class);
     
EasyMock.expect(taskStorageMock.getStatus(task1.getId())).andReturn(Optional.absent());
     
EasyMock.expect(taskStorageMock.getStatus(task2.getId())).andReturn(Optional.absent()).times(2);
+
     
EasyMock.expect(taskStorageMock.getStatus(task3.getId())).andReturn(Optional.of(TaskStatus.running(task3.getId())));
+    
EasyMock.expect(taskStorageMock.getTask(task3.getId())).andReturn(Optional.of(task3));
+
     
EasyMock.expect(taskStorageMock.getStatus(task4.getId())).andReturn(Optional.of(TaskStatus.running(task4.getId())));
+    
EasyMock.expect(taskStorageMock.getTask(task4.getId())).andReturn(Optional.of(task4));
+
     
EasyMock.expect(taskStorageMock.getStatus(task5.getId())).andReturn(Optional.of(TaskStatus.success(task5.getId())));
+
     EasyMock.replay(taskStorageMock);
 
     HttpRemoteTaskRunner taskRunner = new HttpRemoteTaskRunner(
@@ -1396,7 +1407,9 @@ public class HttpRemoteTaskRunnerTest
 
     TaskStorage taskStorage = EasyMock.createMock(TaskStorage.class);
     
EasyMock.expect(taskStorage.getStatus(task1.getId())).andReturn(Optional.of(TaskStatus.running(task1.getId())));
+    
EasyMock.expect(taskStorage.getTask(task1.getId())).andReturn(Optional.of(task1));
     
EasyMock.expect(taskStorage.getStatus(task2.getId())).andReturn(Optional.of(TaskStatus.running(task2.getId())));
+    
EasyMock.expect(taskStorage.getTask(task2.getId())).andReturn(Optional.of(task2));
     
EasyMock.expect(taskStorage.getStatus(task3.getId())).andReturn(Optional.of(TaskStatus.success(task3.getId())));
     
EasyMock.expect(taskStorage.getStatus(task4.getId())).andReturn(Optional.of(TaskStatus.success(task4.getId())));
     
EasyMock.expect(taskStorage.getStatus(task5.getId())).andReturn(Optional.absent());
@@ -1468,6 +1481,54 @@ public class HttpRemoteTaskRunnerTest
     );
   }
 
+  @Test
+  public void 
test_taskAddedOrUpdated_taskNotFoundInStorage_raisesAlert_andShutsDownTask()
+  {
+    final Task task = NoopTask.create();
+
+    // Setup storage to return a task status but not the task payload
+    final TaskStatus statusInStorage = TaskStatus.running(task.getId());
+
+    final TaskStorage taskStorage = EasyMock.createMock(TaskStorage.class);
+    
EasyMock.expect(taskStorage.getStatus(task.getId())).andReturn(Optional.of(statusInStorage));
+    
EasyMock.expect(taskStorage.getTask(task.getId())).andReturn(Optional.absent());
+    EasyMock.replay(taskStorage);
+
+    final HttpRemoteTaskRunner taskRunner =
+        createTaskRunnerForTestTaskAddedOrUpdated(taskStorage, new 
ArrayList<>());
+
+    // Expect worker to get shutdown notification
+    final Worker worker = new Worker("http", "localhost", "127.0.0.1", 1, 
"v1", WorkerConfig.DEFAULT_CATEGORY);
+    final WorkerHolder workerHolder = EasyMock.createMock(WorkerHolder.class);
+    EasyMock.expect(workerHolder.getWorker()).andReturn(worker).anyTimes();
+    workerHolder.shutdownTask(task.getId());
+    EasyMock.replay(workerHolder);
+
+    Assertions.assertEquals(0, taskRunner.getKnownTasks().size());
+
+    // Send the announcement to the TaskRunner
+    final TaskAnnouncement announcement = TaskAnnouncement.create(
+        task,
+        TaskStatus.running(task.getId()),
+        TaskLocation.create("worker", 1, 2)
+    );
+    taskRunner.taskAddedOrUpdated(announcement, workerHolder);
+
+    // Verify that alert has been raised
+    final List<AlertEvent> alerts = emitter.getAlerts();
+    Assertions.assertEquals(1, alerts.size());
+    Assertions.assertEquals(
+        StringUtils.format(
+            "Could not fetch payload of task[%s] with status[%s]."
+            + " Ignoring notification[%s] from worker[%s].",
+            task.getId(), statusInStorage, announcement, worker.getHost()
+        ),
+        alerts.getFirst().getDescription()
+    );
+
+    EasyMock.verify(workerHolder, taskStorage);
+  }
+
   @Test
   public void testTimeoutInAssigningTasks() throws Exception
   {
@@ -1905,15 +1966,15 @@ public class HttpRemoteTaskRunnerTest
             }
 
             @Override
-            public void locationChanged(String taskId, TaskLocation 
newLocation)
+            public void locationChanged(Task task, TaskLocation newLocation)
             {
-              listenerNotificationsAccumulator.add(ImmutableList.of(taskId, 
newLocation));
+              
listenerNotificationsAccumulator.add(ImmutableList.of(task.getId(), 
newLocation));
             }
 
             @Override
-            public void statusChanged(String taskId, TaskStatus status)
+            public void statusChanged(Task task, TaskStatus status)
             {
-              listenerNotificationsAccumulator.add(ImmutableList.of(taskId, 
status));
+              
listenerNotificationsAccumulator.add(ImmutableList.of(task.getId(), status));
             }
           },
           Execs.directExecutor()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to