34public class TaskDeadlockWatcher
implements Runnable {
35 private boolean exitRequested;
37 private static final long DEADLOCK_WATCHER_SLEEP_MS = 1000;
38 private static final long TASK_TOO_LONG_MS = 1000;
39 private static final Logger logger = LogManager.getLogger(TaskDeadlockWatcher.class);
44 private final HashMap<String, Task> _alreadyAlertedTaskMap =
new HashMap<>();
46 public TaskDeadlockWatcher(
TaskManager taskManager) {
47 this.taskManager = taskManager;
50 public void requestExit() {
51 logger.info(
"TaskDeadlockWatcher exit requested");
58 while (!exitRequested) {
60 var tasks = taskManager.getTasks().stream().collect(Collectors.toList()).stream()
61 .filter(t -> t !=
null && t.getRunStartTime().isPresent())
62 .sorted(Comparator.comparingLong((
Task t) -> t.getTaskCreationTime()).reversed())
63 .collect(Collectors.toList());
65 for (
int i = 0; i < tasks.size(); i++) {
66 var task = tasks.get(i);
67 if (task ==
null || _alreadyAlertedTaskMap.containsKey(task.getTaskId())) {
71 if (task.getElapsedTimeFromRunStartTime() > TASK_TOO_LONG_MS) {
72 var elapsedTime = task.getElapsedTimeFromRunStartTime();
73 logger.error(
"Task {} deadlock detected, task has been running for {}ms, task: {}, stacktrace: {}", task.getTaskId(), elapsedTime, task, task.getCreationStackTraceStr());
74 _alreadyAlertedTaskMap.put(task.getTaskId(), task);
78 Thread.sleep(DEADLOCK_WATCHER_SLEEP_MS);
79 }
catch (Exception ex) {
80 logger.error(
"Error in TaskDeadlockWatcher", ex);