Skip to content

Commit

Permalink
Run scheduled tasks from other plugins using API in sequence
Browse files Browse the repository at this point in the history
This prevents two transactions executing at the same time.

Affects issues:
- Fixed #3147
  • Loading branch information
AuroraLS3 committed Sep 24, 2023
1 parent 8bda0ff commit 55c13d1
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class Processing implements SubSystem {
private final ErrorLogger errorLogger;

private ExecutorService nonCriticalExecutor;
private ExecutorService nonCriticalSingleThreadExecutor;
private ExecutorService criticalExecutor;

@Inject
Expand All @@ -50,6 +51,7 @@ public Processing(
this.logger = logger;
this.errorLogger = errorLogger;
nonCriticalExecutor = createExecutor(6, "Plan Non critical-pool-%d");
nonCriticalSingleThreadExecutor = createExecutor(1, "Plan Non critical-pool-single-threaded-%d");
criticalExecutor = createExecutor(2, "Plan Critical-pool-%d");
}

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

public CompletableFuture<Boolean> submitNonCritical(Runnable runnable) {
if (runnable == null || nonCriticalExecutor.isShutdown()) {
return submitNonCritical(runnable, false);
}

public CompletableFuture<Boolean> submitNonCritical(Runnable runnable, boolean singleThreaded) {
ExecutorService executorService = singleThreaded ? nonCriticalSingleThreadExecutor : nonCriticalExecutor;
if (runnable == null || executorService.isShutdown()) {
return null;
}
return CompletableFuture.supplyAsync(() -> {
runnable.run();
return true;
}, nonCriticalExecutor).handle(this::exceptionHandlerNonCritical);
}, executorService).handle(this::exceptionHandlerNonCritical);
}

public CompletableFuture<Boolean> submitCritical(Runnable runnable) {
Expand Down Expand Up @@ -138,21 +145,25 @@ public void enable() {
if (nonCriticalExecutor.isShutdown()) {
nonCriticalExecutor = createExecutor(6, "Plan Non critical-pool-%d");
}
if (nonCriticalSingleThreadExecutor.isShutdown()) {
nonCriticalSingleThreadExecutor = createExecutor(1, "Plan Non critical-pool-single-threaded-%d");
}
if (criticalExecutor.isShutdown()) {
criticalExecutor = createExecutor(2, "Plan Critical-pool-%d");
}
}

@Override
public void disable() {
shutdownNonCriticalExecutor();
shutdownNonCriticalExecutors();
shutdownCriticalExecutor();
ensureShutdown();
logger.info(locale.get().getString(PluginLang.DISABLED_PROCESSING_COMPLETE));
}

private void shutdownNonCriticalExecutor() {
private void shutdownNonCriticalExecutors() {
nonCriticalExecutor.shutdownNow();
nonCriticalSingleThreadExecutor.shutdownNow();
}

private void shutdownCriticalExecutor() {
Expand Down Expand Up @@ -184,12 +195,16 @@ private void ensureShutdown() {
if (!nonCriticalExecutor.isTerminated()) {
nonCriticalExecutor.shutdownNow();
}
if (!nonCriticalSingleThreadExecutor.isTerminated()) {
nonCriticalSingleThreadExecutor.shutdownNow();
}
if (!criticalExecutor.isTerminated() && !criticalExecutor.awaitTermination(1, TimeUnit.SECONDS)) {
criticalExecutor.shutdownNow();
}
} catch (InterruptedException e) {
logger.error("Processing shutdown thread interrupted: " + e.getMessage());
nonCriticalExecutor.shutdownNow();
nonCriticalSingleThreadExecutor.shutdownNow();
criticalExecutor.shutdownNow();
Thread.currentThread().interrupt();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
@Singleton
public class SchedulerSvc implements SchedulerService {

private static final boolean SINGLE_THREADED = true;

private final Processing processing;

@Inject
Expand All @@ -33,7 +35,7 @@ public SchedulerSvc(Processing processing) {

@Override
public void runAsync(Runnable runnable) {
processing.submitNonCritical(runnable);
processing.submitNonCritical(runnable, SINGLE_THREADED);
}

public void register() {
Expand Down

0 comments on commit 55c13d1

Please sign in to comment.