RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
TaskDeadlockWatcher.java
1package com.osroyale.game.task;
2
3import org.apache.logging.log4j.LogManager;
4import org.apache.logging.log4j.Logger;
5
6import java.util.Comparator;
7import java.util.HashMap;
8import java.util.stream.Collectors;
9
33
34public class TaskDeadlockWatcher implements Runnable {
35 private boolean exitRequested;
36 private final TaskManager taskManager;
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);
40
44 private final HashMap<String, Task> _alreadyAlertedTaskMap = new HashMap<>();
45
46 public TaskDeadlockWatcher(TaskManager taskManager) {
47 this.taskManager = taskManager;
48 }
49
50 public void requestExit() {
51 logger.info("TaskDeadlockWatcher exit requested");
52 exitRequested = true;
53 }
54
55 @Override
56
57 public void run() {
58 while (!exitRequested) {
59 try {
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());
64
65 for (int i = 0; i < tasks.size(); i++) {
66 var task = tasks.get(i);
67 if (task == null || _alreadyAlertedTaskMap.containsKey(task.getTaskId())) {
68 continue;
69 }
70
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);
75 }
76 }
77
78 Thread.sleep(DEADLOCK_WATCHER_SLEEP_MS);
79 } catch (Exception ex) {
80 logger.error("Error in TaskDeadlockWatcher", ex);
81 }
82 }
83 }
84}