RuneHive-Game
Loading...
Searching...
No Matches
TaskDeadlockWatcher.java
Go to the documentation of this file.
1package com.runehive.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
10public class TaskDeadlockWatcher implements Runnable {
11 private boolean exitRequested;
12 private final TaskManager taskManager;
13 private static final long DEADLOCK_WATCHER_SLEEP_MS = 1000;
14 private static final long TASK_TOO_LONG_MS = 1000;
15 private static final Logger logger = LogManager.getLogger(TaskDeadlockWatcher.class);
16
17 /**
18 * A map of tasks that have already alerted us to a deadlock, we don't want to spam the logs
19 */
20 private final HashMap<String, Task> _alreadyAlertedTaskMap = new HashMap<>();
21
23 this.taskManager = taskManager;
24 }
25
26 public void requestExit() {
27 logger.info("TaskDeadlockWatcher exit requested");
28 exitRequested = true;
29 }
30
31 @Override
32
33 public void run() {
34 while (!exitRequested) {
35 try {
36 var tasks = taskManager.getTasks().stream().collect(Collectors.toList()).stream()
37 .filter(t -> t != null && t.getRunStartTime().isPresent())
38 .sorted(Comparator.comparingLong((Task t) -> t.getTaskCreationTime()).reversed())
39 .collect(Collectors.toList());
40
41 for (int i = 0; i < tasks.size(); i++) {
42 var task = tasks.get(i);
43 if (task == null || _alreadyAlertedTaskMap.containsKey(task.getTaskId())) {
44 continue;
45 }
46
47 if (task.getElapsedTimeFromRunStartTime() > TASK_TOO_LONG_MS) {
48 var elapsedTime = task.getElapsedTimeFromRunStartTime();
49 logger.error("Task {} deadlock detected, task has been running for {}ms, task: {}, stacktrace: {}", task.getTaskId(), elapsedTime, task, task.getCreationStackTraceStr());
50 _alreadyAlertedTaskMap.put(task.getTaskId(), task);
51 }
52 }
53
54 Thread.sleep(DEADLOCK_WATCHER_SLEEP_MS);
55 } catch (Exception ex) {
56 logger.error("Error in TaskDeadlockWatcher", ex);
57 }
58 }
59 }
60}
final HashMap< String, Task > _alreadyAlertedTaskMap
A map of tasks that have already alerted us to a deadlock, we don't want to spam the logs.
A game representing a cyclic unit of work.
Definition Task.java:11
The class that handles scheduling tasks, and processing them.