|
@@ -45,6 +45,7 @@ import org.elasticsearch.xpack.core.transform.transforms.TransformState;
|
|
|
import org.elasticsearch.xpack.core.transform.transforms.TransformTaskParams;
|
|
|
import org.elasticsearch.xpack.core.transform.transforms.TransformTaskState;
|
|
|
import org.elasticsearch.xpack.transform.DefaultTransformExtension;
|
|
|
+import org.elasticsearch.xpack.transform.TransformNode;
|
|
|
import org.elasticsearch.xpack.transform.TransformServices;
|
|
|
import org.elasticsearch.xpack.transform.checkpoint.TransformCheckpointService;
|
|
|
import org.elasticsearch.xpack.transform.notifications.MockTransformAuditor;
|
|
@@ -57,6 +58,7 @@ import org.mockito.verification.VerificationMode;
|
|
|
|
|
|
import java.time.Clock;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.Optional;
|
|
|
import java.util.Set;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
@@ -73,6 +75,8 @@ import static org.hamcrest.Matchers.nullValue;
|
|
|
import static org.hamcrest.Matchers.sameInstance;
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
import static org.mockito.ArgumentMatchers.anyLong;
|
|
|
+import static org.mockito.ArgumentMatchers.eq;
|
|
|
+import static org.mockito.ArgumentMatchers.isNull;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.never;
|
|
|
import static org.mockito.Mockito.times;
|
|
@@ -130,7 +134,8 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
new TransformScheduler(clock, threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
auditor,
|
|
|
threadPool,
|
|
|
- Collections.emptyMap()
|
|
|
+ Collections.emptyMap(),
|
|
|
+ mockTransformNode()
|
|
|
);
|
|
|
|
|
|
TaskManager taskManager = mock(TaskManager.class);
|
|
@@ -174,6 +179,12 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
assertEquals(state.getReason(), null);
|
|
|
}
|
|
|
|
|
|
+ private TransformNode mockTransformNode() {
|
|
|
+ var transformNode = mock(TransformNode.class);
|
|
|
+ when(transformNode.isShuttingDown()).thenReturn(randomBoolean() ? Optional.of(false) : Optional.<Boolean>empty());
|
|
|
+ return transformNode;
|
|
|
+ }
|
|
|
+
|
|
|
private TransformServices transformServices(Clock clock, TransformAuditor auditor, ThreadPool threadPool) {
|
|
|
var transformsConfigManager = new InMemoryTransformConfigManager();
|
|
|
var transformsCheckpointService = new TransformCheckpointService(
|
|
@@ -192,7 +203,8 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
transformsConfigManager,
|
|
|
transformsCheckpointService,
|
|
|
auditor,
|
|
|
- new TransformScheduler(clock, threadPool, Settings.EMPTY, TimeValue.ZERO)
|
|
|
+ new TransformScheduler(clock, threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
+ mock(TransformNode.class)
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -234,7 +246,8 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
new TransformScheduler(Clock.systemUTC(), threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
auditor,
|
|
|
threadPool,
|
|
|
- Collections.emptyMap()
|
|
|
+ Collections.emptyMap(),
|
|
|
+ mockTransformNode()
|
|
|
);
|
|
|
|
|
|
TaskManager taskManager = mock(TaskManager.class);
|
|
@@ -279,6 +292,66 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
assertEquals(state.getReason(), null);
|
|
|
}
|
|
|
|
|
|
+ public void testFailWhenNodeIsShuttingDown() {
|
|
|
+ var threadPool = mock(ThreadPool.class);
|
|
|
+ when(threadPool.executor("generic")).thenReturn(mock(ExecutorService.class));
|
|
|
+
|
|
|
+ var transformConfig = TransformConfigTests.randomTransformConfigWithoutHeaders();
|
|
|
+ var auditor = MockTransformAuditor.createMockAuditor();
|
|
|
+
|
|
|
+ var transformState = new TransformState(
|
|
|
+ TransformTaskState.STARTED,
|
|
|
+ IndexerState.INDEXING,
|
|
|
+ null,
|
|
|
+ 0L,
|
|
|
+ "because",
|
|
|
+ null,
|
|
|
+ null,
|
|
|
+ false,
|
|
|
+ null
|
|
|
+ );
|
|
|
+
|
|
|
+ var node = mock(TransformNode.class);
|
|
|
+ when(node.isShuttingDown()).thenReturn(Optional.of(true));
|
|
|
+ when(node.nodeId()).thenReturn("node");
|
|
|
+
|
|
|
+ var transformTask = new TransformTask(
|
|
|
+ 42,
|
|
|
+ "some_type",
|
|
|
+ "some_action",
|
|
|
+ TaskId.EMPTY_TASK_ID,
|
|
|
+ createTransformTaskParams(transformConfig.getId()),
|
|
|
+ transformState,
|
|
|
+ new TransformScheduler(Clock.systemUTC(), threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
+ auditor,
|
|
|
+ threadPool,
|
|
|
+ Collections.emptyMap(),
|
|
|
+ node
|
|
|
+ );
|
|
|
+
|
|
|
+ var taskManager = mock(TaskManager.class);
|
|
|
+ var persistentTasksService = mock(PersistentTasksService.class);
|
|
|
+ transformTask.init(persistentTasksService, taskManager, "task-id", 42);
|
|
|
+ var listenerCalled = new AtomicBoolean(false);
|
|
|
+ transformTask.fail(null, "because", ActionTestUtils.assertNoFailureListener(r -> { listenerCalled.compareAndSet(false, true); }));
|
|
|
+
|
|
|
+ var state = transformTask.getState();
|
|
|
+ assertEquals(TransformTaskState.STARTED, state.getTaskState());
|
|
|
+ assertEquals(IndexerState.STARTED, state.getIndexerState());
|
|
|
+
|
|
|
+ assertTrue(listenerCalled.get());
|
|
|
+ // verify shutdown has been called
|
|
|
+ verify(taskManager, times(1)).unregister(any());
|
|
|
+ verify(persistentTasksService, times(1)).sendCompletionRequest(
|
|
|
+ eq("task-id"),
|
|
|
+ eq(42L),
|
|
|
+ isNull(),
|
|
|
+ eq("Node is shutting down."),
|
|
|
+ isNull(),
|
|
|
+ any()
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
public void testGetTransformTask() {
|
|
|
{
|
|
|
ClusterState clusterState = ClusterState.EMPTY_STATE;
|
|
@@ -453,7 +526,8 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
new TransformScheduler(Clock.systemUTC(), threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
auditor,
|
|
|
threadPool,
|
|
|
- Collections.emptyMap()
|
|
|
+ Collections.emptyMap(),
|
|
|
+ mockTransformNode()
|
|
|
);
|
|
|
assertThat(transformTask.getContext().getAuthState().getStatus(), is(equalTo(HealthStatus.GREEN)));
|
|
|
|
|
@@ -502,7 +576,8 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
new TransformScheduler(Clock.systemUTC(), threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
auditor,
|
|
|
threadPool,
|
|
|
- Collections.emptyMap()
|
|
|
+ Collections.emptyMap(),
|
|
|
+ mockTransformNode()
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -603,7 +678,8 @@ public class TransformTaskTests extends ESTestCase {
|
|
|
new TransformScheduler(mock(Clock.class), threadPool, Settings.EMPTY, TimeValue.ZERO),
|
|
|
auditor,
|
|
|
threadPool,
|
|
|
- Collections.emptyMap()
|
|
|
+ Collections.emptyMap(),
|
|
|
+ mockTransformNode()
|
|
|
);
|
|
|
|
|
|
ClientTransformIndexer indexer = mock(ClientTransformIndexer.class);
|