Skip to content

Commit 55c13d1

Browse files
committed
Run scheduled tasks from other plugins using API in sequence
This prevents two transactions executing at the same time. Affects issues: - Fixed #3147
1 parent 8bda0ff commit 55c13d1

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

Plan/common/src/main/java/com/djrapitops/plan/processing/Processing.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class Processing implements SubSystem {
3838
private final ErrorLogger errorLogger;
3939

4040
private ExecutorService nonCriticalExecutor;
41+
private ExecutorService nonCriticalSingleThreadExecutor;
4142
private ExecutorService criticalExecutor;
4243

4344
@Inject
@@ -50,6 +51,7 @@ public Processing(
5051
this.logger = logger;
5152
this.errorLogger = errorLogger;
5253
nonCriticalExecutor = createExecutor(6, "Plan Non critical-pool-%d");
54+
nonCriticalSingleThreadExecutor = createExecutor(1, "Plan Non critical-pool-single-threaded-%d");
5355
criticalExecutor = createExecutor(2, "Plan Critical-pool-%d");
5456
}
5557

@@ -71,13 +73,18 @@ public void submit(Runnable runnable) {
7173
}
7274

7375
public CompletableFuture<Boolean> submitNonCritical(Runnable runnable) {
74-
if (runnable == null || nonCriticalExecutor.isShutdown()) {
76+
return submitNonCritical(runnable, false);
77+
}
78+
79+
public CompletableFuture<Boolean> submitNonCritical(Runnable runnable, boolean singleThreaded) {
80+
ExecutorService executorService = singleThreaded ? nonCriticalSingleThreadExecutor : nonCriticalExecutor;
81+
if (runnable == null || executorService.isShutdown()) {
7582
return null;
7683
}
7784
return CompletableFuture.supplyAsync(() -> {
7885
runnable.run();
7986
return true;
80-
}, nonCriticalExecutor).handle(this::exceptionHandlerNonCritical);
87+
}, executorService).handle(this::exceptionHandlerNonCritical);
8188
}
8289

8390
public CompletableFuture<Boolean> submitCritical(Runnable runnable) {
@@ -138,21 +145,25 @@ public void enable() {
138145
if (nonCriticalExecutor.isShutdown()) {
139146
nonCriticalExecutor = createExecutor(6, "Plan Non critical-pool-%d");
140147
}
148+
if (nonCriticalSingleThreadExecutor.isShutdown()) {
149+
nonCriticalSingleThreadExecutor = createExecutor(1, "Plan Non critical-pool-single-threaded-%d");
150+
}
141151
if (criticalExecutor.isShutdown()) {
142152
criticalExecutor = createExecutor(2, "Plan Critical-pool-%d");
143153
}
144154
}
145155

146156
@Override
147157
public void disable() {
148-
shutdownNonCriticalExecutor();
158+
shutdownNonCriticalExecutors();
149159
shutdownCriticalExecutor();
150160
ensureShutdown();
151161
logger.info(locale.get().getString(PluginLang.DISABLED_PROCESSING_COMPLETE));
152162
}
153163

154-
private void shutdownNonCriticalExecutor() {
164+
private void shutdownNonCriticalExecutors() {
155165
nonCriticalExecutor.shutdownNow();
166+
nonCriticalSingleThreadExecutor.shutdownNow();
156167
}
157168

158169
private void shutdownCriticalExecutor() {
@@ -184,12 +195,16 @@ private void ensureShutdown() {
184195
if (!nonCriticalExecutor.isTerminated()) {
185196
nonCriticalExecutor.shutdownNow();
186197
}
198+
if (!nonCriticalSingleThreadExecutor.isTerminated()) {
199+
nonCriticalSingleThreadExecutor.shutdownNow();
200+
}
187201
if (!criticalExecutor.isTerminated() && !criticalExecutor.awaitTermination(1, TimeUnit.SECONDS)) {
188202
criticalExecutor.shutdownNow();
189203
}
190204
} catch (InterruptedException e) {
191205
logger.error("Processing shutdown thread interrupted: " + e.getMessage());
192206
nonCriticalExecutor.shutdownNow();
207+
nonCriticalSingleThreadExecutor.shutdownNow();
193208
criticalExecutor.shutdownNow();
194209
Thread.currentThread().interrupt();
195210
}

Plan/common/src/main/java/com/djrapitops/plan/settings/SchedulerSvc.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
@Singleton
2525
public class SchedulerSvc implements SchedulerService {
2626

27+
private static final boolean SINGLE_THREADED = true;
28+
2729
private final Processing processing;
2830

2931
@Inject
@@ -33,7 +35,7 @@ public SchedulerSvc(Processing processing) {
3335

3436
@Override
3537
public void runAsync(Runnable runnable) {
36-
processing.submitNonCritical(runnable);
38+
processing.submitNonCritical(runnable, SINGLE_THREADED);
3739
}
3840

3941
public void register() {

0 commit comments

Comments
 (0)