Skip to content

Commit

Permalink
Ensure that the task is not in the tasks queue when it is rejected fr…
Browse files Browse the repository at this point in the history
…om the executor

Closes #4900
  • Loading branch information
ahus1 committed Oct 13, 2023
1 parent 7e1dc81 commit 7b3a47c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/main/java/io/vertx/core/impl/TaskQueue.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ public Consumer<Runnable> unschedule() {
*/
public void execute(Runnable task, Executor executor) {
synchronized (tasks) {
tasks.add(new ExecuteTask(task, executor));
if (currentExecutor == null) {
currentExecutor = executor;
try {
Expand All @@ -135,6 +134,16 @@ public void execute(Runnable task, Executor executor) {
throw e;
}
}
tasks.add(new ExecuteTask(task, executor));
}
}

/**
* Test if the task queue is empty and no current executor is running anymore.
*/
public boolean isEmpty() {
synchronized (tasks) {
return tasks.isEmpty() && currentExecutor == null;
}
}

Expand Down
34 changes: 34 additions & 0 deletions src/test/java/io/vertx/core/impl/TaskQueueTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.vertx.core.impl;

import org.assertj.core.api.Assertions;
import org.junit.Test;

import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException;

import static org.assertj.core.api.Assertions.assertThatThrownBy;

/**
* @author Alexander Schwartz
*/
public class TaskQueueTest {

Executor executorThatAlwaysThrowsRejectedExceptions = new Executor() {
@Override
public void execute(Runnable command) {
throw new RejectedExecutionException();
}
};

TaskQueue taskQueue = new TaskQueue();

@Test
public void shouldNotHaveTaskInQueueWhenTaskHasBeenRejected() {
assertThatThrownBy(
() -> taskQueue.execute(new Thread(), executorThatAlwaysThrowsRejectedExceptions)
).isInstanceOf(RejectedExecutionException.class);

Assertions.assertThat(taskQueue.isEmpty()).isTrue();
}

}

0 comments on commit 7b3a47c

Please sign in to comment.