This is an automated email from the ASF dual-hosted git repository.
timoninmaxim pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new ab278862bd3 IGNITE-18783 Fix DistributedProcess hangs on
AssertionError (#10537)
ab278862bd3 is described below
commit ab278862bd322e0d2d76557c263c6c1a7b97375c
Author: Maksim Timonin <[email protected]>
AuthorDate: Thu Feb 16 11:43:38 2023 +0300
IGNITE-18783 Fix DistributedProcess hangs on AssertionError (#10537)
---
.../managers/encryption/GridEncryptionManager.java | 8 +-
.../managers/encryption/GroupKeyChangeProcess.java | 6 +-
.../snapshot/IgniteSnapshotManager.java | 4 +-
.../snapshot/SnapshotRestoreProcess.java | 14 +-
.../util/distributed/DistributedProcess.java | 55 ++++---
.../internal/util/distributed/FullMessage.java | 6 +-
.../util/distributed/SingleNodeMessage.java | 6 +-
.../util/DistributedProcessErrorHandlingTest.java | 169 +++++++++++++++++++++
.../ignite/testsuites/IgniteUtilSelfTestSuite.java | 2 +
9 files changed, 228 insertions(+), 42 deletions(-)
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
index 8e1f5be7b7e..f1f5f11c553 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
@@ -1568,7 +1568,7 @@ public class GridEncryptionManager extends
GridManagerAdapter<EncryptionSpi> imp
* @param res Results.
* @param err Errors.
*/
- private void finishPrepareMasterKeyChange(UUID id, Map<UUID, EmptyResult>
res, Map<UUID, Exception> err) {
+ private void finishPrepareMasterKeyChange(UUID id, Map<UUID, EmptyResult>
res, Map<UUID, Throwable> err) {
if (!err.isEmpty()) {
if (masterKeyChangeRequest != null &&
masterKeyChangeRequest.requestId().equals(id))
masterKeyChangeRequest = null;
@@ -1613,7 +1613,7 @@ public class GridEncryptionManager extends
GridManagerAdapter<EncryptionSpi> imp
* @param res Results.
* @param err Errors.
*/
- private void finishPerformMasterKeyChange(UUID id, Map<UUID, EmptyResult>
res, Map<UUID, Exception> err) {
+ private void finishPerformMasterKeyChange(UUID id, Map<UUID, EmptyResult>
res, Map<UUID, Throwable> err) {
completeMasterKeyChangeFuture(id, err);
}
@@ -1621,7 +1621,7 @@ public class GridEncryptionManager extends
GridManagerAdapter<EncryptionSpi> imp
* @param reqId Request id.
* @param err Exception.
*/
- private void completeMasterKeyChangeFuture(UUID reqId, Map<UUID,
Exception> err) {
+ private void completeMasterKeyChangeFuture(UUID reqId, Map<UUID,
Throwable> err) {
synchronized (opsMux) {
boolean isInitiator = masterKeyChangeFut != null &&
masterKeyChangeFut.id().equals(reqId);
@@ -1629,7 +1629,7 @@ public class GridEncryptionManager extends
GridManagerAdapter<EncryptionSpi> imp
return;
if (!F.isEmpty(err)) {
- Exception e = err.values().stream().findFirst().get();
+ Throwable e = err.values().stream().findFirst().get();
masterKeyChangeFut.onDone(e);
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java
b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java
index 855d34e22d4..a8b63bce215 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java
@@ -273,7 +273,7 @@ class GroupKeyChangeProcess {
* @param res Results.
* @param err Errors.
*/
- private void finishPrepare(UUID id, Map<UUID, EmptyResult> res, Map<UUID,
Exception> err) {
+ private void finishPrepare(UUID id, Map<UUID, EmptyResult> res, Map<UUID,
Throwable> err) {
if (!err.isEmpty()) {
if (req != null && req.requestId().equals(id))
req = null;
@@ -318,7 +318,7 @@ class GroupKeyChangeProcess {
* @param res Results.
* @param err Errors.
*/
- private void finishPerform(UUID id, Map<UUID, EmptyResult> res, Map<UUID,
Exception> err) {
+ private void finishPerform(UUID id, Map<UUID, EmptyResult> res, Map<UUID,
Throwable> err) {
completeFuture(id, err, fut);
}
@@ -328,7 +328,7 @@ class GroupKeyChangeProcess {
* @param fut Key change future.
* @return {@code True} if future was completed by this call.
*/
- private boolean completeFuture(UUID reqId, Map<UUID, Exception> err,
GroupKeyChangeFuture fut) {
+ private boolean completeFuture(UUID reqId, Map<UUID, Throwable> err,
GroupKeyChangeFuture fut) {
boolean isInitiator = fut != null && fut.id().equals(reqId);
if (!isInitiator || fut.isDone())
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java
index 212e5ba8b07..4710dca0962 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java
@@ -891,7 +891,7 @@ public class IgniteSnapshotManager extends
GridCacheSharedManagerAdapter
* @param res Results.
* @param err Errors.
*/
- private void processLocalSnapshotStartStageResult(UUID id, Map<UUID,
SnapshotOperationResponse> res, Map<UUID, Exception> err) {
+ private void processLocalSnapshotStartStageResult(UUID id, Map<UUID,
SnapshotOperationResponse> res, Map<UUID, Throwable> err) {
if (cctx.kernalContext().clientNode())
return;
@@ -1106,7 +1106,7 @@ public class IgniteSnapshotManager extends
GridCacheSharedManagerAdapter
* @param res Results.
* @param err Errors.
*/
- private void processLocalSnapshotEndStageResult(UUID id, Map<UUID,
SnapshotOperationResponse> res, Map<UUID, Exception> err) {
+ private void processLocalSnapshotEndStageResult(UUID id, Map<UUID,
SnapshotOperationResponse> res, Map<UUID, Throwable> err) {
SnapshotOperationRequest snpReq = clusterSnpReq;
if (snpReq == null || !F.eq(id, snpReq.requestId()))
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java
index 2d489728edc..ca09ee198e7 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java
@@ -771,13 +771,13 @@ public class SnapshotRestoreProcess {
* @param res Results.
* @param errs Errors.
*/
- private void finishPrepare(UUID reqId, Map<UUID,
SnapshotRestoreOperationResponse> res, Map<UUID, Exception> errs) {
+ private void finishPrepare(UUID reqId, Map<UUID,
SnapshotRestoreOperationResponse> res, Map<UUID, Throwable> errs) {
if (ctx.clientNode())
return;
SnapshotRestoreContext opCtx0 = opCtx;
- Exception failure = F.first(errs.values());
+ Throwable failure = F.first(errs.values());
assert opCtx0 != null || failure != null : "Context has not been
created on the node " + ctx.localNodeId();
@@ -1173,13 +1173,13 @@ public class SnapshotRestoreProcess {
* @param res Results.
* @param errs Errors.
*/
- private void finishPreload(UUID reqId, Map<UUID, Boolean> res, Map<UUID,
Exception> errs) {
+ private void finishPreload(UUID reqId, Map<UUID, Boolean> res, Map<UUID,
Throwable> errs) {
if (ctx.clientNode())
return;
SnapshotRestoreContext opCtx0 = opCtx;
- Exception failure = errs.values().stream().findFirst().
+ Throwable failure = errs.values().stream().findFirst().
orElse(checkNodeLeft(opCtx0.nodes(), res.keySet()));
opCtx0.errHnd.accept(failure);
@@ -1232,13 +1232,13 @@ public class SnapshotRestoreProcess {
* @param res Results.
* @param errs Errors.
*/
- private void finishCacheStart(UUID reqId, Map<UUID, Boolean> res,
Map<UUID, Exception> errs) {
+ private void finishCacheStart(UUID reqId, Map<UUID, Boolean> res,
Map<UUID, Throwable> errs) {
if (ctx.clientNode())
return;
SnapshotRestoreContext opCtx0 = opCtx;
- Exception failure = errs.values().stream().findFirst().
+ Throwable failure = errs.values().stream().findFirst().
orElse(checkNodeLeft(opCtx0.nodes(), res.keySet()));
if (failure == null) {
@@ -1375,7 +1375,7 @@ public class SnapshotRestoreProcess {
* @param res Results.
* @param errs Errors.
*/
- private void finishRollback(UUID reqId, Map<UUID, Boolean> res, Map<UUID,
Exception> errs) {
+ private void finishRollback(UUID reqId, Map<UUID, Boolean> res, Map<UUID,
Throwable> errs) {
if (ctx.clientNode())
return;
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java
index f0081a5377b..ad0a84d2f42 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java
@@ -96,7 +96,7 @@ public class DistributedProcess<I extends Serializable, R
extends Serializable>
GridKernalContext ctx,
DistributedProcessType type,
Function<I, IgniteInternalFuture<R>> exec,
- CI3<UUID, Map<UUID, R>, Map<UUID, Exception>> finish
+ CI3<UUID, Map<UUID, R>, Map<UUID, Throwable>> finish
) {
this(ctx, type, exec, finish, (id, req) -> new InitMessage<>(id, type,
req));
}
@@ -112,7 +112,7 @@ public class DistributedProcess<I extends Serializable, R
extends Serializable>
GridKernalContext ctx,
DistributedProcessType type,
Function<I, IgniteInternalFuture<R>> exec,
- CI3<UUID, Map<UUID, R>, Map<UUID, Exception>> finish,
+ CI3<UUID, Map<UUID, R>, Map<UUID, Throwable>> finish,
BiFunction<UUID, I, ? extends InitMessage<I>> initMsgFactory
) {
this.ctx = ctx;
@@ -146,22 +146,32 @@ public class DistributedProcess<I extends Serializable, R
extends Serializable>
if (crd.isLocal())
initCoordinator(p, topVer);
- IgniteInternalFuture<R> fut = exec.apply((I)msg.request());
+ try {
+ IgniteInternalFuture<R> fut = exec.apply((I)msg.request());
- fut.listen(f -> {
- if (f.error() != null)
- p.resFut.onDone(f.error());
- else
- p.resFut.onDone(f.result());
+ fut.listen(f -> {
+ if (f.error() != null)
+ p.resFut.onDone(f.error());
+ else
+ p.resFut.onDone(f.result());
- if (!ctx.clientNode()) {
- assert crd != null;
+ if (!ctx.clientNode()) {
+ assert crd != null;
- sendSingleMessage(p);
- }
- });
+ sendSingleMessage(p);
+ }
+ });
+
+ p.initFut.onDone();
+ }
+ catch (Throwable err) {
+ U.error(log, "Failed to handle InitMessage [id=" + p.id + ']',
err);
- p.initFut.onDone();
+ p.resFut.onDone(err);
+
+ if (!ctx.clientNode())
+ sendSingleMessage(p);
+ }
});
ctx.discovery().setCustomEventListener(FullMessage.class, (topVer,
snd, msg0) -> {
@@ -180,9 +190,15 @@ public class DistributedProcess<I extends Serializable, R
extends Serializable>
return;
}
- finish.apply(p.id, msg.result(), msg.error());
-
- processes.remove(msg.processId());
+ try {
+ finish.apply(p.id, msg.result(), msg.error());
+ }
+ catch (Throwable err) {
+ U.error(log, "Failed to handle FullMessage [id=" + p.id + ']',
err);
+ }
+ finally {
+ processes.remove(msg.processId());
+ }
});
ctx.io().addMessageListener(GridTopic.TOPIC_DISTRIBUTED_PROCESS,
(nodeId, msg0, plc) -> {
@@ -274,8 +290,7 @@ public class DistributedProcess<I extends Serializable, R
extends Serializable>
private void sendSingleMessage(Process p) {
assert p.resFut.isDone();
- SingleNodeMessage<R> singleMsg = new SingleNodeMessage<>(p.id, type,
p.resFut.result(),
- (Exception)p.resFut.error());
+ SingleNodeMessage<R> singleMsg = new SingleNodeMessage<>(p.id, type,
p.resFut.result(), p.resFut.error());
UUID crdId = p.crdId;
@@ -333,7 +348,7 @@ public class DistributedProcess<I extends Serializable, R
extends Serializable>
private void finishProcess(Process p) {
HashMap<UUID, R> res = new HashMap<>();
- HashMap<UUID, Exception> err = new HashMap<>();
+ HashMap<UUID, Throwable> err = new HashMap<>();
p.singleMsgs.forEach((uuid, msg) -> {
if (msg.hasError())
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
index 852cfe7b056..3522c463def 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
@@ -54,7 +54,7 @@ public class FullMessage<R extends Serializable> implements
DiscoveryCustomMessa
private Map<UUID, R> res;
/** Errors. */
- private Map<UUID, Exception> err;
+ private Map<UUID, Throwable> err;
/**
* @param processId Process id.
@@ -62,7 +62,7 @@ public class FullMessage<R extends Serializable> implements
DiscoveryCustomMessa
* @param res Results.
* @param err Errors
*/
- public FullMessage(UUID processId, DistributedProcessType type, Map<UUID,
R> res, Map<UUID, Exception> err) {
+ public FullMessage(UUID processId, DistributedProcessType type, Map<UUID,
R> res, Map<UUID, Throwable> err) {
this.processId = processId;
this.type = type.ordinal();
this.res = res;
@@ -106,7 +106,7 @@ public class FullMessage<R extends Serializable> implements
DiscoveryCustomMessa
}
/** @return Nodes errors. */
- public Map<UUID, Exception> error() {
+ public Map<UUID, Throwable> error() {
return err;
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
index 6d46e600502..56f1062f98a 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
@@ -51,7 +51,7 @@ public class SingleNodeMessage<R extends Serializable>
implements Message {
private R resp;
/** Error. */
- private Exception err;
+ private Throwable err;
/** Empty constructor for marshalling purposes. */
public SingleNodeMessage() {
@@ -63,7 +63,7 @@ public class SingleNodeMessage<R extends Serializable>
implements Message {
* @param resp Single node response.
* @param err Error.
*/
- public SingleNodeMessage(UUID processId, DistributedProcessType type, R
resp, Exception err) {
+ public SingleNodeMessage(UUID processId, DistributedProcessType type, R
resp, Throwable err) {
this.processId = processId;
this.type = type.ordinal();
this.resp = resp;
@@ -194,7 +194,7 @@ public class SingleNodeMessage<R extends Serializable>
implements Message {
}
/** @return Error. */
- public Exception error() {
+ public Throwable error() {
return err;
}
}
diff --git
a/modules/core/src/test/java/org/apache/ignite/internal/util/DistributedProcessErrorHandlingTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/util/DistributedProcessErrorHandlingTest.java
new file mode 100644
index 00000000000..674157e4328
--- /dev/null
+++
b/modules/core/src/test/java/org/apache/ignite/internal/util/DistributedProcessErrorHandlingTest.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.util;
+
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiFunction;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.cluster.ClusterState;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.failure.StopNodeFailureHandler;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.util.distributed.DistributedProcess;
+import org.apache.ignite.internal.util.future.GridFinishedFuture;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import static
org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.TEST_PROCESS;
+import static org.apache.ignite.testframework.GridTestUtils.runAsync;
+
+/** */
+@RunWith(Parameterized.class)
+public class DistributedProcessErrorHandlingTest extends
GridCommonAbstractTest {
+ /** */
+ private static final int SRV_NODES = 3;
+
+ /** If {@code true} then client fails, otherwise server node fails. */
+ @Parameterized.Parameter
+ public boolean failClient;
+
+ /** */
+ @Parameterized.Parameters(name = "failClient={0}")
+ public static Iterable<Boolean> params() {
+ return F.asList(false, true);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String
instanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(instanceName);
+
+ cfg.setFailureHandler(new StopNodeFailureHandler());
+
+ return cfg;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ startGrids(SRV_NODES);
+
+ startClientGrid();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() {
+ stopAllGrids();
+ }
+
+ /** */
+ @Test
+ public void testBackgroundExecFailureHandled() throws Exception {
+ checkDistributedProcess((ign, latch) ->
+ new DistributedProcess<>(ign.context(), TEST_PROCESS,
+ req -> runAsync(() -> {
+ failOnNode(ign); // Fails processing request in a spawned
thread.
+
+ return 0;
+ }),
+ (id, res, err) -> {
+ if (failClient)
+ assertEquals(SRV_NODES, res.values().size());
+ else {
+ assertEquals(SRV_NODES - 1, res.values().size());
+ assertEquals(1, err.size());
+ assertTrue(err.get(grid(1).localNode().id())
instanceof AssertionError);
+ }
+
+ latch.countDown();
+ }));
+ }
+
+ /** */
+ @Test
+ public void testExecFailureHandled() throws Exception {
+ checkDistributedProcess((ign, latch) ->
+ new DistributedProcess<>(ign.context(), TEST_PROCESS,
+ req -> {
+ failOnNode(ign); // Fails processing request in the
discovery thread.
+
+ return new GridFinishedFuture<>(0);
+ },
+ (id, res, err) -> {
+ if (failClient)
+ assertEquals(SRV_NODES, res.values().size());
+ else {
+ assertEquals(SRV_NODES - 1, res.values().size());
+ assertEquals(1, err.size());
+ assertTrue(err.get(grid(1).localNode().id())
instanceof AssertionError);
+ }
+
+ latch.countDown();
+ }));
+ }
+
+ /** */
+ @Test
+ public void testFinishFailureHandled() throws Exception {
+ checkDistributedProcess((ign, latch) ->
+ new DistributedProcess<>(ign.context(), TEST_PROCESS,
+ req -> new GridFinishedFuture<>(0),
+ (uuid, res, err) -> {
+ assertEquals(SRV_NODES, res.values().size());
+ latch.countDown();
+
+ failOnNode(ign);
+ }));
+ }
+
+ /** */
+ private void checkDistributedProcess(
+ BiFunction<IgniteEx, CountDownLatch, DistributedProcess<Integer,
Integer>> processFactory
+ ) throws Exception {
+ DistributedProcess<Integer, Integer> process = null;
+
+ CountDownLatch latch = new CountDownLatch(SRV_NODES + 1);
+
+ for (Ignite g: G.allGrids())
+ process = processFactory.apply((IgniteEx)g, latch);
+
+ process.start(UUID.randomUUID(), 0);
+
+ assertTrue(latch.await(5, TimeUnit.SECONDS));
+
+ // Just checks that node is alive.
+ grid(1).cluster().state(ClusterState.INACTIVE);
+
+ awaitPartitionMapExchange();
+
+ waitForTopology(SRV_NODES + 1);
+ }
+
+ /** Checks whether to fail on specified node. */
+ private void failOnNode(IgniteEx ign) {
+ if (failClient)
+ assert !ign.configuration().isClientMode();
+ else
+ assert getTestIgniteInstanceIndex(ign.name()) != 1;
+ }
+}
diff --git
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
index 5126a479aea..02667237d4c 100644
---
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
+++
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.IgniteVersionUtilsSelfTest;
import org.apache.ignite.internal.pagemem.impl.PageIdUtilsSelfTest;
import org.apache.ignite.internal.util.BasicRateLimiterTest;
import org.apache.ignite.internal.util.DistributedProcessCoordinatorLeftTest;
+import org.apache.ignite.internal.util.DistributedProcessErrorHandlingTest;
import org.apache.ignite.internal.util.GridArraysSelfTest;
import org.apache.ignite.internal.util.GridConcurrentMultiPairQueueTest;
import org.apache.ignite.internal.util.GridCountDownCallbackTest;
@@ -143,6 +144,7 @@ import org.junit.runners.Suite;
GridCountDownCallbackTest.class,
+ DistributedProcessErrorHandlingTest.class,
DistributedProcessCoordinatorLeftTest.class,
BasicRateLimiterTest.class,