http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResultBatch.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResultBatch.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResultBatch.java new file mode 100644 index 0000000..320c5a9 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResultBatch.java @@ -0,0 +1,155 @@ +/* + * 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.processors.service; + +import java.nio.ByteBuffer; +import java.util.Map; +import org.apache.ignite.internal.util.tostring.GridToStringInclude; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.plugin.extensions.communication.MessageReader; +import org.apache.ignite.plugin.extensions.communication.MessageWriter; +import org.jetbrains.annotations.NotNull; + +import static org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType.IGNITE_UUID; +import static org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType.MSG; + +/** + * Batch of service single node deployment result. + * <p/> + * Contains collection of {@link ServiceSingleNodeDeploymentResult} mapped services ids. + */ +public class ServiceSingleNodeDeploymentResultBatch implements Message { + /** */ + private static final long serialVersionUID = 0L; + + /** Deployment process id. */ + @GridToStringInclude + private ServiceDeploymentProcessId depId; + + /** Services deployments results. */ + @GridToStringInclude + private Map<IgniteUuid, ServiceSingleNodeDeploymentResult> results; + + /** + * Empty constructor for marshalling purposes. + */ + public ServiceSingleNodeDeploymentResultBatch() { + } + + /** + * @param depId Deployment process id. + * @param results Services deployments results. + */ + public ServiceSingleNodeDeploymentResultBatch(@NotNull ServiceDeploymentProcessId depId, + @NotNull Map<IgniteUuid, ServiceSingleNodeDeploymentResult> results) { + this.depId = depId; + this.results = results; + } + + /** + * @return Services deployments results. + */ + public Map<IgniteUuid, ServiceSingleNodeDeploymentResult> results() { + return results; + } + + /** + * @return Deployment process id. + */ + public ServiceDeploymentProcessId deploymentId() { + return depId; + } + + /** {@inheritDoc} */ + @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) { + writer.setBuffer(buf); + + if (!writer.isHeaderWritten()) { + if (!writer.writeHeader(directType(), fieldsCount())) + return false; + + writer.onHeaderWritten(); + } + + switch (writer.state()) { + case 0: + if (!writer.writeMessage("depId", depId)) + return false; + + writer.incrementState(); + + case 1: + if (!writer.writeMap("results", results, IGNITE_UUID, MSG)) + return false; + + writer.incrementState(); + } + + return true; + } + + /** {@inheritDoc} */ + @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) { + reader.setBuffer(buf); + + if (!reader.beforeMessageRead()) + return false; + + switch (reader.state()) { + case 0: + depId = reader.readMessage("depId"); + + if (!reader.isLastRead()) + return false; + + reader.incrementState(); + + case 1: + results = reader.readMap("results", IGNITE_UUID, MSG, false); + + if (!reader.isLastRead()) + return false; + + reader.incrementState(); + } + + return reader.afterMessageRead(ServiceSingleNodeDeploymentResultBatch.class); + } + + /** {@inheritDoc} */ + @Override public short directType() { + return 168; + } + + /** {@inheritDoc} */ + @Override public byte fieldsCount() { + return 2; + } + + /** {@inheritDoc} */ + @Override public void onAckReceived() { + // No-op. + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(ServiceSingleNodeDeploymentResultBatch.class, this); + } +}
http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceUndeploymentRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceUndeploymentRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceUndeploymentRequest.java new file mode 100644 index 0000000..5482362 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceUndeploymentRequest.java @@ -0,0 +1,42 @@ +/* + * 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.processors.service; + +import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.lang.IgniteUuid; +import org.jetbrains.annotations.NotNull; + +/** + * Service undeployment request. + */ +public class ServiceUndeploymentRequest extends ServiceChangeAbstractRequest { + /** */ + private static final long serialVersionUID = 0L; + + /** + * @param srvcId Service id. + */ + public ServiceUndeploymentRequest(@NotNull IgniteUuid srvcId) { + super(srvcId); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(ServiceUndeploymentRequest.class, this); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/main/java/org/apache/ignite/services/ServiceConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/services/ServiceConfiguration.java b/modules/core/src/main/java/org/apache/ignite/services/ServiceConfiguration.java index 37a794b..a517197 100644 --- a/modules/core/src/main/java/org/apache/ignite/services/ServiceConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/services/ServiceConfiguration.java @@ -181,6 +181,8 @@ public class ServiceConfiguration implements Serializable { * Gets cache name used for key-to-node affinity calculation. * <p> * This parameter is optional and is set only when deploying service based on key-affinity. + * <p/> + * <b>NOTE:</b> If the cache is destroyed, the service will be undeployed automatically. * * @return Cache name, possibly {@code null}. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java index e61d30a..0edb497 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java @@ -150,6 +150,7 @@ import org.jetbrains.annotations.Nullable; import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2; import static org.apache.ignite.IgniteSystemProperties.IGNITE_DISCOVERY_CLIENT_RECONNECT_HISTORY_SIZE; import static org.apache.ignite.IgniteSystemProperties.IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED; import static org.apache.ignite.IgniteSystemProperties.getInteger; import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; import static org.apache.ignite.events.EventType.EVT_NODE_JOINED; @@ -163,6 +164,7 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_COMPACT_FOOTER; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_USE_BINARY_STRING_SER_VER_2; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_USE_DFLT_SUID; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED; import static org.apache.ignite.spi.IgnitePortProtocol.TCP; import static org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.AUTH_FAILED; import static org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.CHECK_FAILED; @@ -4044,6 +4046,48 @@ class ServerImpl extends TcpDiscoveryImpl { return; } + final Boolean locSrvcProcModeAttr = locNode.attribute(ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED); + // Can be null only in module tests of discovery spi (without node startup). + final Boolean locSrvcProcMode = locSrvcProcModeAttr != null ? locSrvcProcModeAttr : false; + + final Boolean rmtSrvcProcModeAttr = node.attribute(ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED); + final boolean rmtSrvcProcMode = rmtSrvcProcModeAttr != null ? rmtSrvcProcModeAttr : false; + + if (!F.eq(locSrvcProcMode, rmtSrvcProcMode)) { + utilityPool.execute( + new Runnable() { + @Override public void run() { + String errMsg = "Local node's " + IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED + + " property value differs from remote node's value " + + "(to make sure all nodes in topology have identical service processor mode, " + + "configure system property explicitly) " + + "[locSrvcProcMode=" + locSrvcProcMode + + ", rmtSrvcProcMode=" + rmtSrvcProcMode + + ", locNodeAddrs=" + U.addressesAsString(locNode) + + ", rmtNodeAddrs=" + U.addressesAsString(node) + + ", locNodeId=" + locNode.id() + ", rmtNodeId=" + msg.creatorNodeId() + ']'; + + String sndMsg = "Local node's " + IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED + + " property value differs from remote node's value " + + "(to make sure all nodes in topology have identical service processor mode, " + + "configure system property explicitly) " + + "[locSrvcProcMode=" + rmtSrvcProcMode + + ", rmtSrvcProcMode=" + locSrvcProcMode + + ", locNodeAddrs=" + U.addressesAsString(node) + ", locPort=" + node.discoveryPort() + + ", rmtNodeAddr=" + U.addressesAsString(locNode) + ", locNodeId=" + node.id() + + ", rmtNodeId=" + locNode.id() + ']'; + + nodeCheckError( + node, + errMsg, + sndMsg); + } + }); + + // Ignore join request. + return; + } + // Handle join. node.internalOrder(ring.nextNodeOrder()); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/GridDeploymentSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridDeploymentSelfTest.java index 000581a..2c41c8e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/GridDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/GridDeploymentSelfTest.java @@ -480,7 +480,7 @@ public class GridDeploymentSelfTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override public boolean register(ClassLoader ldr, Class rsrc) throws IgniteSpiException { - if (super.register(ldr, rsrc)) { + if (super.register(ldr, rsrc) && ComputeTaskAdapter.class.isAssignableFrom(rsrc)) { deployCnt++; return true; http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectServicesTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectServicesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectServicesTest.java index 98803e0..a42f960 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectServicesTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectServicesTest.java @@ -30,6 +30,7 @@ import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.services.Service; import org.apache.ignite.services.ServiceContext; import org.apache.ignite.testframework.GridTestUtils; +import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -133,6 +134,8 @@ public class IgniteClientReconnectServicesTest extends IgniteClientReconnectAbst */ @Test public void testReconnectInDeploying() throws Exception { + Assume.assumeTrue(!isEventDrivenServiceProcessorEnabled()); + Ignite client = grid(serverCount()); assertTrue(client.cluster().localNode().isClient()); @@ -179,6 +182,52 @@ public class IgniteClientReconnectServicesTest extends IgniteClientReconnectAbst /** * @throws Exception If failed. */ + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") + @Test + public void testReconnectInDeployingNew() throws Exception { + Assume.assumeTrue(isEventDrivenServiceProcessorEnabled()); + + IgniteEx client = grid(serverCount()); + + assertTrue(client.cluster().localNode().isClient()); + + final IgniteServices services = client.services(); + + Ignite srv = ignite(0); + + final IgniteInternalFuture<Object> fut = GridTestUtils.runAsync(new Callable<Object>() { + @Override public Object call() throws Exception { + try { + services.deployClusterSingleton("testReconnectInDeploying", new TestServiceImpl()); + } + catch (IgniteClientDisconnectedException e) { + checkAndWait(e); + + return true; + } + + return false; + } + }); + + reconnectClientNode(client, srv, () -> { + // Check that client waiting operation. + GridTestUtils.assertThrows(log, () -> fut.get(200), IgniteFutureTimeoutCheckedException.class, null); + + try { + assertNotDone(fut); + } + catch (Exception e) { + fail("Unexpected exception has been thrown, err=" + e.getMessage()); + } + }); + + assertTrue((Boolean)fut.get(2, TimeUnit.SECONDS)); + } + + /** + * @throws Exception If failed. + */ @Test public void testReconnectInProgress() throws Exception { Ignite client = grid(serverCount()); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java index 8db1551..cc88a6a 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java @@ -35,6 +35,7 @@ import org.junit.runners.JUnit4; import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2; import static org.apache.ignite.IgniteSystemProperties.IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID; import static org.apache.ignite.IgniteSystemProperties.IGNITE_SECURITY_COMPATIBILITY_MODE; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED; import static org.apache.ignite.configuration.DeploymentMode.CONTINUOUS; import static org.apache.ignite.configuration.DeploymentMode.SHARED; @@ -246,6 +247,17 @@ public abstract class GridDiscoveryManagerAttributesSelfTest extends GridCommonA * @throws Exception If failed. */ @Test + public void testServiceProcessorModeProperty() throws Exception { + doTestCompatibilityEnabled(IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, true, false, true); + doTestCompatibilityEnabled(IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, false, true, true); + doTestCompatibilityEnabled(IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, true, true, false); + doTestCompatibilityEnabled(IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, false, false, false); + } + + /** + * @throws Exception If failed. + */ + @Test public void testSecurityCompatibilityEnabled() throws Exception { TestReconnectPluginProvider.enabled = true; TestReconnectProcessor.enabled = true; http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/GridCacheContinuousQueryAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/GridCacheContinuousQueryAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/GridCacheContinuousQueryAbstractSelfTest.java index 7e66584..b26e4d4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/GridCacheContinuousQueryAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/GridCacheContinuousQueryAbstractSelfTest.java @@ -58,8 +58,10 @@ import org.apache.ignite.configuration.NearCacheConfiguration; import org.apache.ignite.events.CacheQueryExecutedEvent; import org.apache.ignite.events.CacheQueryReadEvent; import org.apache.ignite.events.Event; +import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.continuous.GridContinuousProcessor; import org.apache.ignite.internal.processors.datastructures.GridCacheInternalKeyImpl; +import org.apache.ignite.internal.processors.service.GridServiceProcessor; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.P2; import org.apache.ignite.internal.util.typedef.PA; @@ -206,9 +208,12 @@ public abstract class GridCacheContinuousQueryAbstractSelfTest extends GridCommo }, 3000); for (int i = 0; i < gridCount(); i++) { - GridContinuousProcessor proc = grid(i).context().continuous(); + GridKernalContext ctx = grid(i).context(); + GridContinuousProcessor proc = ctx.continuous(); - assertEquals(String.valueOf(i), 1, ((Map)U.field(proc, "locInfos")).size()); + final int locInfosCnt = ctx.service() instanceof GridServiceProcessor ? 1 : 0; + + assertEquals(String.valueOf(i), locInfosCnt, ((Map)U.field(proc, "locInfos")).size()); assertEquals(String.valueOf(i), 0, ((Map)U.field(proc, "rmtInfos")).size()); assertEquals(String.valueOf(i), 0, ((Map)U.field(proc, "startFuts")).size()); assertEquals(String.valueOf(i), 0, ((Map)U.field(proc, "stopFuts")).size()); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceContinuousQueryRedeployTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceContinuousQueryRedeployTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceContinuousQueryRedeployTest.java index e4157e2..47bdf61 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceContinuousQueryRedeployTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceContinuousQueryRedeployTest.java @@ -132,11 +132,7 @@ public class GridServiceContinuousQueryRedeployTest extends GridCommonAbstractTe svcCfg.setName(SERVICE_NAME); svcCfg.setTotalCount(1); svcCfg.setMaxPerNodeCount(1); - svcCfg.setNodeFilter(new IgnitePredicate<ClusterNode>() { - @Override public boolean apply(ClusterNode node) { - return !node.isClient(); - } - }); + svcCfg.setNodeFilter((IgnitePredicate<ClusterNode>)node -> !node.isClient()); ignite.services().deploy(svcCfg); } http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentCompoundFutureSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentCompoundFutureSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentCompoundFutureSelfTest.java index f2563d2..5a09aa2 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentCompoundFutureSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentCompoundFutureSelfTest.java @@ -25,6 +25,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.internal.IgniteFutureTimeoutCheckedException; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.services.ServiceConfiguration; import org.apache.ignite.services.ServiceDeploymentException; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -40,7 +41,7 @@ public class GridServiceDeploymentCompoundFutureSelfTest extends GridCommonAbstr */ @Test public void testWaitForCompletionOnFailingFuture() throws Exception { - GridServiceDeploymentCompoundFuture compFut = new GridServiceDeploymentCompoundFuture(); + GridServiceDeploymentCompoundFuture<IgniteUuid> compFut = new GridServiceDeploymentCompoundFuture<>(); int failingFutsNum = 2; @@ -51,7 +52,7 @@ public class GridServiceDeploymentCompoundFutureSelfTest extends GridCommonAbstr for (int i = 0; i < failingFutsNum; i++) { ServiceConfiguration failingCfg = config("Failed-" + i); - GridServiceDeploymentFuture failingFut = new GridServiceDeploymentFuture(failingCfg); + GridServiceDeploymentFuture<IgniteUuid> failingFut = new GridServiceDeploymentFuture<>(failingCfg, IgniteUuid.randomUuid()); failingFuts.add(failingFut); @@ -61,7 +62,7 @@ public class GridServiceDeploymentCompoundFutureSelfTest extends GridCommonAbstr List<GridFutureAdapter<Object>> futs = new ArrayList<>(completingFutsNum); for (int i = 0; i < completingFutsNum; i++) { - GridServiceDeploymentFuture fut = new GridServiceDeploymentFuture(config(String.valueOf(i))); + GridServiceDeploymentFuture<IgniteUuid> fut = new GridServiceDeploymentFuture<>(config(String.valueOf(i)), IgniteUuid.randomUuid()); futs.add(fut); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentExceptionPropagationTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentExceptionPropagationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentExceptionPropagationTest.java index d5df828..60f632a 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentExceptionPropagationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceDeploymentExceptionPropagationTest.java @@ -18,11 +18,13 @@ package org.apache.ignite.internal.processors.service; import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.services.Service; import org.apache.ignite.services.ServiceContext; -import org.apache.ignite.testframework.GridStringLogger; +import org.apache.ignite.services.ServiceDeploymentException; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Assume; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -31,26 +33,37 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class GridServiceDeploymentExceptionPropagationTest extends GridCommonAbstractTest { /** */ - @SuppressWarnings("unused") + @BeforeClass + public static void check() { + Assume.assumeTrue(isEventDrivenServiceProcessorEnabled()); + } + + /** */ @Test public void testExceptionPropagation() throws Exception { - try (Ignite srv = startGrid("server")) { - - GridStringLogger log = new GridStringLogger(); - - try (Ignite client = startGrid("client", getConfiguration("client").setGridLogger(log).setClientMode(true))) { + try (IgniteEx srv = startGrid("server")) { + try (Ignite client = startGrid("client", getConfiguration("client").setClientMode(true))) { + final String srvcName = "my-service"; try { - client.services().deployClusterSingleton("my-service", new ServiceImpl()); - } - catch (IgniteException ignored) { - assertTrue(log.toString().contains("ServiceImpl init exception")); + client.services().deployClusterSingleton(srvcName, new ServiceImpl()); - return; // Exception is what we expect. + fail("Deployment exception has been expected."); } + catch (ServiceDeploymentException ex) { + String errMsg = ex.getSuppressed()[0].getMessage(); + + // Check that message contains cause node id + assertTrue(errMsg.contains(srv.cluster().localNode().id().toString())); + + // Check that message contains service name + assertTrue(errMsg.contains(srvcName)); - // Fail explicitly if we've managed to get here though we shouldn't have. - fail("https://issues.apache.org/jira/browse/IGNITE-3392"); + Throwable cause = ex.getSuppressed()[0].getCause(); + + // Check that error's cause contains users message + assertTrue(cause.getMessage().contains("ServiceImpl init exception")); + } } } } http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java index 9197d93..f25a1e4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java @@ -30,7 +30,9 @@ import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInterruptedCheckedException; +import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.affinity.GridAffinityProcessor; import org.apache.ignite.internal.util.lang.GridAbsPredicateX; import org.apache.ignite.internal.util.typedef.CA; @@ -139,7 +141,7 @@ public abstract class GridServiceProcessorAbstractSelfTest extends GridCommonAbs /** * @return Random grid. */ - protected Ignite randomGrid() { + protected IgniteEx randomGrid() { return grid(RAND.nextInt(nodeCount())); } @@ -249,11 +251,11 @@ public abstract class GridServiceProcessorAbstractSelfTest extends GridCommonAbs info("Deployed service: " + name); - fut1.get(); + try { + fut1.get(); - info("Finished waiting for service future: " + name); + info("Finished waiting for service future: " + name); - try { fut2.get(); fail("Failed to receive mismatching configuration exception."); @@ -764,6 +766,19 @@ public abstract class GridServiceProcessorAbstractSelfTest extends GridCommonAbs /** * @param svcName Service name. + * @param ignite Ignite instance. + * @param cnt Expected count. + */ + protected void checkCount(String svcName, IgniteEx ignite, int cnt) throws IgniteInterruptedCheckedException { + AffinityTopologyVersion topVer = ignite.context().discovery().topologyVersionEx(); + + waitForServicesReadyTopology(ignite, topVer); + + assertEquals(cnt, actualCount(svcName, ignite.services().serviceDescriptors())); + } + + /** + * @param svcName Service name. * @param descs Descriptors. * @param cnt Expected count. */ @@ -825,6 +840,32 @@ public abstract class GridServiceProcessorAbstractSelfTest extends GridCommonAbs } /** + * @param ignite Ignite instance. + * @param srvcName Affinity service name. + */ + protected void checkAffinityServiceDeployment(Ignite ignite, String srvcName) { + ServiceDescriptor desc = null; + + for (ServiceDescriptor d : ignite.services().serviceDescriptors()) { + if (d.name().equals(srvcName)) { + desc = d; + + break; + } + } + + assertNotNull(desc); + + assertEquals(1, desc.topologySnapshot().size()); + + ClusterNode n = ignite.affinity(desc.cacheName()).mapKeyToNode(desc.affinityKey()); + + assertNotNull(n); + + assertTrue(desc.topologySnapshot().containsKey(n.id())); + } + + /** * Affinity service. */ protected static class AffinityService implements Service { @@ -853,11 +894,6 @@ public abstract class GridServiceProcessorAbstractSelfTest extends GridCommonAbs /** {@inheritDoc} */ @Override public void init(ServiceContext ctx) throws Exception { X.println("Initializing affinity service for key: " + affKey); - - ClusterNode n = g.affinity(CACHE_NAME).mapKeyToNode(affKey); - - assertNotNull(n); - assertTrue(n.isLocal()); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorBatchDeploySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorBatchDeploySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorBatchDeploySelfTest.java index b77144c..625b287 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorBatchDeploySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorBatchDeploySelfTest.java @@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.ignite.Ignite; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteNodeAttributes; import org.apache.ignite.lang.IgniteFuture; @@ -37,6 +38,7 @@ import org.apache.ignite.services.ServiceConfiguration; import org.apache.ignite.services.ServiceDeploymentException; import org.apache.ignite.services.ServiceDescriptor; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Assume; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -132,16 +134,7 @@ public class GridServiceProcessorBatchDeploySelfTest extends GridCommonAbstractT CountDownLatch latch = new CountDownLatch(numServices); - IgnitePredicate<ClusterNode> depPred = client.cluster().forServers() - .forPredicate(new IgnitePredicate<ClusterNode>() { - @Override public boolean apply(ClusterNode node) { - String gridName = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME); - - assert gridName != null; - - return gridName.startsWith(getTestIgniteInstanceName()); - } - }).predicate(); + IgnitePredicate<ClusterNode> depPred = new TestPredicate(getTestIgniteInstanceName()); List<ServiceConfiguration> cfgs = getConfigs(depPred, numServices); @@ -185,16 +178,7 @@ public class GridServiceProcessorBatchDeploySelfTest extends GridCommonAbstractT CountDownLatch latch = new CountDownLatch(numServices); - IgnitePredicate<ClusterNode> depPred = client.cluster().forServers() - .forPredicate(new IgnitePredicate<ClusterNode>() { - @Override public boolean apply(ClusterNode node) { - String gridName = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME); - - assert gridName != null; - - return gridName.startsWith(getTestIgniteInstanceName()); - } - }).predicate(); + IgnitePredicate<ClusterNode> depPred = new TestPredicate(getTestIgniteInstanceName()); List<ServiceConfiguration> cfgs = getConfigs(depPred, numServices); @@ -430,10 +414,12 @@ public class GridServiceProcessorBatchDeploySelfTest extends GridCommonAbstractT /** * @throws Exception If failed. */ - @Ignore("https://issues.apache.org/jira/browse/IGNITE-10021") @Test public void testCancelAllTopologyChange() throws Exception { - Ignite client = grid(CLIENT_NODE_NAME); + IgniteEx client = grid(CLIENT_NODE_NAME); + + Assume.assumeFalse("https://issues.apache.org/jira/browse/IGNITE-10021", + client.context().service() instanceof GridServiceProcessor); int numServices = 500; @@ -661,4 +647,28 @@ public class GridServiceProcessorBatchDeploySelfTest extends GridCommonAbstractT } }); } + + /** + * Test predicate. + */ + private static class TestPredicate implements IgnitePredicate<ClusterNode> { + /** */ + private final String namePrefix; + + /** + * @param namePrefix Prefix to match instances name. + */ + public TestPredicate(String namePrefix) { + this.namePrefix = namePrefix; + } + + /** {@inheritDoc} */ + @Override public boolean apply(ClusterNode node) { + String gridName = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME); + + assert gridName != null; + + return !node.isClient() && gridName.startsWith(namePrefix); + } + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java index d328db2..b1e557f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java @@ -20,9 +20,9 @@ package org.apache.ignite.internal.processors.service; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; -import org.apache.ignite.Ignite; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.util.lang.GridAbsPredicateX; import org.apache.ignite.services.ServiceConfiguration; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; @@ -192,22 +192,28 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc */ @Test public void testAffinityUpdateTopology() throws Exception { - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); - checkCount(AFFINITY, g.services().serviceDescriptors(), 1); + checkCount(AFFINITY, g, 1); + + checkAffinityServiceDeployment(g, AFFINITY); int nodeCnt = 2; startExtraNodes(nodeCnt); try { - checkCount(AFFINITY, g.services().serviceDescriptors(), 1); + checkCount(AFFINITY, g, 1); + + checkAffinityServiceDeployment(g, AFFINITY); } finally { stopExtraNodes(nodeCnt); } - checkCount(AFFINITY, g.services().serviceDescriptors(), 1); + checkCount(AFFINITY, g, 1); + + checkAffinityServiceDeployment(g, AFFINITY); } /** @@ -215,13 +221,13 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc */ @Test public void testDeployLimits() throws Exception { - final Ignite g = randomGrid(); + final IgniteEx g = randomGrid(); final String name = NODE_SINGLE_WITH_LIMIT; waitForDeployment(name, nodeCount()); - checkCount(name, g.services().serviceDescriptors(), nodeCount()); + checkCount(name, g, nodeCount()); CountDownLatch latch = new CountDownLatch(1); @@ -236,7 +242,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc waitForDeployment(name, nodeCount() + 1); - checkCount(name, g.services().serviceDescriptors(), nodeCount() + 1); + checkCount(name, g, nodeCount() + 1); } finally { stopExtraNodes(extraNodes); @@ -247,7 +253,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc // Service can be redeployed when nodes is stopping one-by-one. assertEquals(0, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), nodeCount()); + checkCount(name, g, nodeCount()); } /** @@ -255,7 +261,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc * @throws Exception If failed. */ private void checkSingletonUpdateTopology(String name) throws Exception { - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); startExtraNodes(2, 2); @@ -265,7 +271,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc info(">>> Passed checks."); - checkCount(name, g.services().serviceDescriptors(), 1); + checkCount(name, g, 1); } finally { stopExtraNodes(4); @@ -277,7 +283,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc * @throws Exception If failed. */ private void checkDeployOnEachNodeUpdateTopology(String name) throws Exception { - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); int newNodes = 4; @@ -297,7 +303,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc // not start and cancel events individually. assertEquals(name, newNodes, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), nodeCount() + newNodes); + checkCount(name, g, nodeCount() + newNodes); } finally { stopExtraNodes(newNodes); @@ -305,7 +311,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc waitForDeployment(name, nodeCount()); - checkCount(name, g.services().serviceDescriptors(), nodeCount()); + checkCount(name, g, nodeCount()); } /** @@ -313,7 +319,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc * @throws Exception If failed. */ private void checkDeployOnEachNodeButClientUpdateTopology(String name) throws Exception { - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); int servers = 2; @@ -335,7 +341,7 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc // not start and cancel events individually. assertEquals(name, servers, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), nodeCount() + servers); + checkCount(name, g, nodeCount() + servers); } finally { stopExtraNodes(servers + clients); @@ -343,6 +349,6 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc waitForDeployment(name, nodeCount()); - checkCount(name, g.services().serviceDescriptors(), nodeCount()); + checkCount(name, g, nodeCount()); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java index ed331fa..c6bb223 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java @@ -22,6 +22,7 @@ import junit.framework.TestCase; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteServices; import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.lang.IgniteFuture; import org.apache.ignite.services.Service; import org.apache.ignite.services.ServiceConfiguration; @@ -46,7 +47,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA public void testSingletonUpdateTopology() throws Exception { String name = "serviceSingletonUpdateTopology"; - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); CountDownLatch latch = new CountDownLatch(1); @@ -77,7 +78,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA info(">>> Passed checks."); - checkCount(name, g.services().serviceDescriptors(), 1); + checkCount(name, g, 1); } finally { stopExtraNodes(nodeCnt); @@ -89,7 +90,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA */ @Test public void testAffinityDeployUpdateTopology() throws Exception { - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); final Integer affKey = 1; @@ -116,7 +117,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA startExtraNodes(nodeCnt); try { - checkCount(name, g.services().serviceDescriptors(), 1); + checkCount(name, g, 1); } finally { stopExtraNodes(nodeCnt); @@ -134,7 +135,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA try { final String name = "serviceOnEachNodeButClientUpdateTopology"; - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); CountDownLatch latch = new CountDownLatch(nodeCount()); @@ -178,7 +179,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA // not start and cancel events individually. assertEquals(name, nodeCount() + servers, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), nodeCount() + servers); + checkCount(name, g, nodeCount() + servers); } finally { stopExtraNodes(servers + clients); @@ -200,7 +201,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA try { final String name = "serviceOnEachProjectionNodeUpdateTopology"; - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); int prestartedSrvcs = 1; @@ -246,7 +247,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA // not start and cancel events individually. assertEquals(name, clients + prestartedSrvcs, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), clients + prestartedSrvcs); + checkCount(name, g, clients + prestartedSrvcs); } finally { stopExtraNodes(servers + clients); @@ -268,7 +269,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA try { final String name = "serviceOnEachNodeUpdateTopology"; - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); final int prestartedNodes = nodeCount() + 1; @@ -323,7 +324,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA assertEquals(name, prestartedNodes + extraNodes, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), prestartedNodes + extraNodes); + checkCount(name, g, prestartedNodes + extraNodes); } finally { stopExtraNodes(extraNodes); @@ -342,7 +343,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA public void testDeployLimits() throws Exception { final String name = "serviceWithLimitsUpdateTopology"; - Ignite g = randomGrid(); + IgniteEx g = randomGrid(); final int totalInstances = nodeCount() + 1; @@ -394,7 +395,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA // not start and cancel events individually. assertEquals(name, totalInstances, DummyService.started(name) - DummyService.cancelled(name)); - checkCount(name, g.services().serviceDescriptors(), totalInstances); + checkCount(name, g, totalInstances); } finally { stopExtraNodes(extraNodes); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java index b022622..33db5fa 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java @@ -230,7 +230,8 @@ public class GridServiceProcessorProxySelfTest extends GridServiceProcessorAbstr ignite.services(ignite.cluster().forLocal()).deployClusterSingleton(name, new MapServiceImpl<String, Integer>()); for (int i = 1; i < nodeCount(); i++) { - MapService<Integer, String> svc = grid(i).services().serviceProxy(name, MapService.class, false); + MapService<Integer, String> svc = grid(i).services() + .serviceProxy(name, MapService.class, false, 1_000L); // Make sure service is a proxy. assertFalse(svc instanceof Service); @@ -445,7 +446,7 @@ public class GridServiceProcessorProxySelfTest extends GridServiceProcessorAbstr /** * */ - protected class ErrorServiceImpl implements ErrorService { + protected static class ErrorServiceImpl implements ErrorService { /** {@inheritDoc} */ @Override public void cancel(ServiceContext ctx) { // No-op. http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorSingleNodeSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorSingleNodeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorSingleNodeSelfTest.java index e2e5a5d..56d8a34 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorSingleNodeSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorSingleNodeSelfTest.java @@ -17,8 +17,8 @@ package org.apache.ignite.internal.processors.service; -import org.apache.ignite.Ignite; import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.IgniteEx; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -33,7 +33,6 @@ public class GridServiceProcessorSingleNodeSelfTest extends GridServiceProcessor return 1; } - /** * @throws Exception If failed. */ @@ -41,17 +40,20 @@ public class GridServiceProcessorSingleNodeSelfTest extends GridServiceProcessor public void testNodeSingletonNotDeployedProxy() throws Exception { String name = "testNodeSingletonNotDeployedProxy"; - Ignite ignite = randomGrid(); + IgniteEx ignite = randomGrid(); + + try { + // Deploy only on remote nodes. + ignite.services(ignite.cluster().forRemotes()).deployNodeSingleton(name, new CounterServiceImpl()); - // Deploy only on remote nodes. - ignite.services(ignite.cluster().forRemotes()).deployNodeSingleton(name, new CounterServiceImpl()); + assertFalse("Should not reach here in this mode, because exception should be thrown.", + ignite.context().service() instanceof IgniteServiceProcessor); - info("Deployed service: " + name); + info("Deployed service: " + name); - // Get local proxy. - CounterService svc = ignite.services().serviceProxy(name, CounterService.class, false); + // Get local proxy. + CounterService svc = ignite.services().serviceProxy(name, CounterService.class, false); - try { svc.increment(); fail("Should never reach here."); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorStopSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorStopSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorStopSelfTest.java index d17b015..ac3aaa6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorStopSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorStopSelfTest.java @@ -180,7 +180,7 @@ public class GridServiceProcessorStopSelfTest extends GridCommonAbstractTest { /** * */ - public class TestServiceImpl implements Service, TestService { + public static class TestServiceImpl implements Service, TestService { /** Serial version UID. */ private static final long serialVersionUID = 0L; http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceReassignmentSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceReassignmentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceReassignmentSelfTest.java index 532728b..096c9be 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceReassignmentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceReassignmentSelfTest.java @@ -26,7 +26,6 @@ import java.util.concurrent.CountDownLatch; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.IgniteEx; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.testframework.GridTestUtils; @@ -42,6 +41,9 @@ public class GridServiceReassignmentSelfTest extends GridServiceProcessorAbstrac /** */ private static final String SERVICE_NAME = "testService"; + /** */ + private static final long SERVICE_TOP_WAIT_TIMEOUT = 2_000L; + /** {@inheritDoc} */ @Override protected int nodeCount() { return 1; @@ -164,17 +166,17 @@ public class GridServiceReassignmentSelfTest extends GridServiceProcessorAbstrac private boolean checkServices(int total, int maxPerNode, int gridIdx, boolean lastTry) throws Exception { IgniteEx grid = grid(gridIdx); - IgniteInternalCache<GridServiceAssignmentsKey, GridServiceAssignments> cache = grid.utilityCache(); + waitForServicesReadyTopology(grid, grid.context().discovery().topologyVersionEx()); - GridServiceAssignments assignments = cache.get(new GridServiceAssignmentsKey(SERVICE_NAME)); + Map<UUID, Integer> srvcTop = grid.context().service().serviceTopology(SERVICE_NAME, SERVICE_TOP_WAIT_TIMEOUT); - Collection<UUID> nodes = F.viewReadOnly(grid.cluster().nodes(), F.node2id()); + Collection<UUID> nodes = F.viewReadOnly(grid.context().discovery().aliveServerNodes(), F.node2id()); - assertNotNull("Grid assignments object is null", assignments); + assertNotNull("Grid assignments object is null", srvcTop); int sum = 0; - for (Map.Entry<UUID, Integer> entry : assignments.assigns().entrySet()) { + for (Map.Entry<UUID, Integer> entry : srvcTop.entrySet()) { UUID nodeId = entry.getKey(); if (!lastTry && !nodes.contains(nodeId)) @@ -193,9 +195,9 @@ public class GridServiceReassignmentSelfTest extends GridServiceProcessorAbstrac if (total > 0) assertTrue("Total number of services limit exceeded [sum=" + sum + - ", assigns=" + assignments.assigns() + ']', sum <= total); + ", assigns=" + srvcTop + ']', sum <= total); else - assertEquals("Reassign per node failed.", nodes.size(), assignments.assigns().size()); + assertEquals("Reassign per node failed.", nodes.size(), srvcTop.size()); if (!lastTry && proxy(grid).get() != 10) return false; http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceSerializationSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceSerializationSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceSerializationSelfTest.java index 92a7449..9c9cc73 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceSerializationSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceSerializationSelfTest.java @@ -54,7 +54,7 @@ public class GridServiceSerializationSelfTest extends GridCommonAbstractTest { server.services(server.cluster().forServers()) .deployClusterSingleton("my-service", new MyServiceImpl()); - MyService svc = client.services().serviceProxy("my-service", MyService.class, false); + MyService svc = client.services().serviceProxy("my-service", MyService.class, false, 2_000); svc.hello(); http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java index 0ebee6e..f64cef4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java @@ -21,18 +21,14 @@ import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import java.io.Serializable; import java.util.concurrent.ThreadLocalRandom; import javax.cache.configuration.Factory; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteServices; -import org.apache.ignite.binary.BinaryObjectException; -import org.apache.ignite.binary.BinaryReader; -import org.apache.ignite.binary.BinaryWriter; -import org.apache.ignite.binary.Binarylizable; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.services.Service; import org.apache.ignite.services.ServiceConfiguration; import org.apache.ignite.services.ServiceContext; @@ -67,9 +63,18 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat private static final Factory[] serviceFactories = new Factory[] { Parameters.factory(TestServiceImpl.class), Parameters.factory(TestServiceImplExternalizable.class), - Parameters.factory(TestServiceImplBinarylizable.class) }; + /** */ + private static boolean isEventDrivenServiceProcessorEnabled; + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + isEventDrivenServiceProcessorEnabled = grid(0).context().service() instanceof IgniteServiceProcessor; + } + /** {@inheritDoc} */ @Override protected boolean expectedClient(String testGridName) { int i = testsCfg.gridCount(); @@ -93,8 +98,7 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat @Override public void run(IgniteServices services, String svcName, TestService svc) throws Exception { services.deployNodeSingleton(svcName, (Service)svc); - // TODO: Waiting for deployment should be removed after IEP-17 completion - GridTestUtils.waitForCondition(() -> services.service(svcName) != null, DEPLOYMENT_WAIT_TIMEOUT); + waitForServiceDeploymentIfNeeded(services, svcName); } })); } @@ -110,8 +114,7 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat @Override public void run(IgniteServices services, String svcName, TestService svc) throws Exception { services.deployClusterSingleton(svcName, (Service)svc); - // TODO: Waiting for deployment should be removed after IEP-17 completion - GridTestUtils.waitForCondition(() -> services.service(svcName) != null, DEPLOYMENT_WAIT_TIMEOUT); + waitForServiceDeploymentIfNeeded(services, svcName); } })); } @@ -145,8 +148,10 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat @Test public void testMultipleDeploy() throws Exception { runInAllDataModes(new ServiceTestRunnable(true, new DeployClosure() { - @Override public void run(IgniteServices services, String svcName, TestService svc) { + @Override public void run(IgniteServices services, String svcName, TestService svc) throws Exception { services.deployMultiple(svcName, (Service)svc, 0, 1); + + waitForServiceDeploymentIfNeeded(services, svcName); } })); } @@ -176,8 +181,7 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat services.deploy(cfg); - // TODO: Waiting for deployment should be removed after IEP-17 completion - GridTestUtils.waitForCondition(() -> services.service(svcName) != null, DEPLOYMENT_WAIT_TIMEOUT); + waitForServiceDeploymentIfNeeded(services, svcName); } })); } @@ -263,7 +267,7 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat // Expect correct value after being read back. int r = 1000; - while(r-- > 0) + while (r-- > 0) assertEquals(expected, proxy.getValue()); assertEquals("Expected 1 deployed service", 1, services.serviceDescriptors().size()); @@ -279,6 +283,29 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat } } + /** {@inheritDoc} */ + @Override protected boolean isCompatible() throws Exception { + switch (dataMode) { + case SERIALIZABLE: + case CUSTOM_SERIALIZABLE: + case EXTERNALIZABLE: + return true; + } + + return false; + } + + /** + * @param services Ignite services. + * @param srvcName Service name to wait. + * @throws IgniteInterruptedCheckedException If interrupted. + */ + private void waitForServiceDeploymentIfNeeded(IgniteServices services, + String srvcName) throws IgniteInterruptedCheckedException { + if (!isEventDrivenServiceProcessorEnabled) + GridTestUtils.waitForCondition(() -> services.service(srvcName) != null, DEPLOYMENT_WAIT_TIMEOUT); + } + /** * Test service */ @@ -298,7 +325,7 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat /** * Implementation for {@link TestService} */ - public static class TestServiceImpl implements Service, TestService, Serializable { + public static class TestServiceImpl implements Service, TestService { /** Test value. */ protected Object val; @@ -357,27 +384,4 @@ public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariat val = in.readObject(); } } - - /** - * Echo service, binarylizable object - */ - @SuppressWarnings({"PublicInnerClass"}) - public static class TestServiceImplBinarylizable extends TestServiceImpl implements Binarylizable { - /** - * Default constructor. - */ - public TestServiceImplBinarylizable() { - // No-op. - } - - /** {@inheritDoc} */ - @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException { - writer.writeObject("arg", val); - } - - /** {@inheritDoc} */ - @Override public void readBinary(BinaryReader reader) throws BinaryObjectException { - val = reader.readObject("arg"); - } - } } http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceDynamicCachesSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceDynamicCachesSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceDynamicCachesSelfTest.java index 790beb3..a648834 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceDynamicCachesSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceDynamicCachesSelfTest.java @@ -21,10 +21,12 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteServices; import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.util.typedef.PA; import org.apache.ignite.resources.LoggerResource; import org.apache.ignite.services.Service; import org.apache.ignite.services.ServiceContext; +import org.apache.ignite.services.ServiceDeploymentException; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -94,13 +96,14 @@ public class IgniteServiceDynamicCachesSelfTest extends GridCommonAbstractTest { * @throws Exception If failed. */ @Test + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") public void testDeployCalledBeforeCacheStart() throws Exception { String cacheName = "cache"; CacheConfiguration ccfg = new CacheConfiguration(cacheName); ccfg.setBackups(1); - Ignite ig = ignite(0); + IgniteEx ig = grid(0); final IgniteServices svcs = ig.services(); @@ -114,11 +117,26 @@ public class IgniteServiceDynamicCachesSelfTest extends GridCommonAbstractTest { awaitPartitionMapExchange(); - svcs.deployKeyAffinitySingleton(svcName, new TestService(), cacheName, key); + if (ig.context().service() instanceof GridServiceProcessor) { + svcs.deployKeyAffinitySingleton(svcName, new TestService(), cacheName, key); - assert svcs.service(svcName) == null; + assertNull(svcs.service(svcName)); - ig.createCache(ccfg); + ig.createCache(ccfg); + } + else if (ig.context().service() instanceof IgniteServiceProcessor) { + GridTestUtils.assertThrowsWithCause(() -> { + svcs.deployKeyAffinitySingleton(svcName, new TestService(), cacheName, key); + + return null; + }, ServiceDeploymentException.class); + + ig.createCache(ccfg); + + svcs.deployKeyAffinitySingleton(svcName, new TestService(), cacheName, key); + } + else + fail("Unexpected service implementation."); try { boolean res = GridTestUtils.waitForCondition(new PA() { http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceReassignmentTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceReassignmentTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceReassignmentTest.java index c118d6d..ff30c29 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceReassignmentTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceReassignmentTest.java @@ -35,6 +35,7 @@ import org.apache.ignite.services.ServiceContext; import org.apache.ignite.testframework.GridStringLogger; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -87,13 +88,15 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { public void testNodeRestart1() throws Exception { srvcCfg = serviceConfiguration(); - Ignite node1 = startGrid(1); + IgniteEx node1 = startGrid(1); + + waitForService(node1); assertEquals(42, serviceProxy(node1).foo()); srvcCfg = serviceConfiguration(); - Ignite node2 = startGrid(2); + IgniteEx node2 = startGrid(2); node1.close(); @@ -103,7 +106,9 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { srvcCfg = serviceConfiguration(); - Ignite node3 = startGrid(3); + IgniteEx node3 = startGrid(3); + + waitForService(node3); assertEquals(42, serviceProxy(node3).foo()); @@ -111,6 +116,10 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { node1 = startGrid(1); + waitForService(node1); + waitForService(node2); + waitForService(node3); + assertEquals(42, serviceProxy(node1).foo()); assertEquals(42, serviceProxy(node2).foo()); assertEquals(42, serviceProxy(node3).foo()); @@ -118,6 +127,7 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { node2.close(); waitForService(node1); + waitForService(node3); assertEquals(42, serviceProxy(node1).foo()); assertEquals(42, serviceProxy(node3).foo()); @@ -174,7 +184,7 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { if (nodeIdx == stopIdx) continue; - waitForService(ignite(nodeIdx)); + waitForService(grid(nodeIdx)); assertEquals(42, serviceProxy(ignite(nodeIdx)).foo()); } @@ -191,6 +201,8 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { */ @Test public void testZombieAssignmentsCleanup() throws Exception { + Assume.assumeTrue(!isEventDrivenServiceProcessorEnabled()); + useStrLog = true; final int nodesCnt = 2; @@ -248,6 +260,8 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { */ @Test public void testNodeStopWhileThereAreCacheActivitiesInServiceProcessor() throws Exception { + Assume.assumeTrue(!isEventDrivenServiceProcessorEnabled()); + final int nodesCnt = 2; final int maxSvc = 1024; @@ -286,19 +300,23 @@ public class IgniteServiceReassignmentTest extends GridCommonAbstractTest { * @param node Node. * @throws Exception If failed. */ - private void waitForService(final Ignite node) throws Exception { - assertTrue(GridTestUtils.waitForCondition(new PA() { - @Override public boolean apply() { - try { - serviceProxy(node).foo(); - - return true; + private void waitForService(final IgniteEx node) throws Exception { + if (node.context().service() instanceof IgniteServiceProcessor) + waitForServicesReadyTopology(node, node.context().discovery().topologyVersionEx()); + else { + assertTrue(GridTestUtils.waitForCondition(new PA() { + @Override public boolean apply() { + try { + serviceProxy(node).foo(); + + return true; + } + catch (IgniteException ignored) { + return false; + } } - catch (IgniteException ignored) { - return false; - } - } - }, 5000)); + }, 5000)); + } } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentDiscoveryListenerNotificationOrderTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentDiscoveryListenerNotificationOrderTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentDiscoveryListenerNotificationOrderTest.java new file mode 100644 index 0000000..b07ecb7 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentDiscoveryListenerNotificationOrderTest.java @@ -0,0 +1,115 @@ + /* + * 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.processors.service; + + import java.util.Collection; + import java.util.EventListener; + import java.util.List; + import java.util.concurrent.ConcurrentMap; + import org.apache.ignite.internal.IgniteEx; + import org.apache.ignite.internal.events.DiscoveryCustomEvent; + import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager; + import org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager; + import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture; + import org.apache.ignite.internal.util.GridConcurrentLinkedHashSet; + import org.apache.ignite.testframework.GridTestUtils; + import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + import org.junit.Assume; + import org.junit.BeforeClass; + import org.junit.Test; + import org.junit.runner.RunWith; + import org.junit.runners.JUnit4; + + /** + * <b>Tests in the class strongly depend on implementation of {@link GridEventStorageManager} and internal logic of + * services and PME discovery listeners.</b> + * <p/> + * Tests that discovery listener registered by {@link ServiceDeploymentManager} will be notified earlier than discovery + * listener registered by {@link GridCachePartitionExchangeManager}. It allows service manager capture custom message + * because it may be nullified in PME process at the end of exchange in {@link GridDhtPartitionsExchangeFuture#onDone()}. + */ + @RunWith(JUnit4.class) + public class ServiceDeploymentDiscoveryListenerNotificationOrderTest extends GridCommonAbstractTest { + /** */ + @BeforeClass + public static void check() { + Assume.assumeTrue(isEventDrivenServiceProcessorEnabled()); + } + + /** + * <b>Strongly depends on internal implementation of {@link GridEventStorageManager}.</b> + * <p/> + * Tests that discovery listener registered by {@link ServiceDeploymentManager} is in collection of hight priority + * listeners, at the same time discovery listener registered by {@link GridCachePartitionExchangeManager} is in + * collection of usual listeners. + * <p/> + * This guarantees that service deployment discovery listener will be notified earlier that PME's discovery listener + * and will be able to capture custom messages which may be nullified in PME process. + * + * @throws Exception In case of an error. + */ + @Test + public void testServiceDiscoveryListenerNotifiedEarlierThanPME() throws Exception { + try { + IgniteEx ignite = startGrid(0); + + ConcurrentMap<Integer, Object> lsnrs = GridTestUtils + .getFieldValue(ignite.context().event(), "lsnrs"); + + Object customLsnrs = lsnrs.get(DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT); + + List<EventListener> highPriorityLsnrs = GridTestUtils.getFieldValue(customLsnrs, "highPriorityLsnrs"); + + GridConcurrentLinkedHashSet<EventListener> usualLsnrs = GridTestUtils + .getFieldValue(customLsnrs, "lsnrs"); + + assertTrue("Failed to find service deployment manager's listener in high priority listeners.", + containsListener(highPriorityLsnrs, ServiceDeploymentManager.class)); + + assertFalse("Service deployment manager's listener shoud not be registered in usual listeners.", + containsListener(usualLsnrs, ServiceDeploymentManager.class)); + + assertTrue("Failed to find PME manager's discovery listener in usual listeners.", + containsListener(usualLsnrs, GridCachePartitionExchangeManager.class)); + + assertFalse("PME manager's discovery listener shoud not be registered in high priority listeners.", + containsListener(highPriorityLsnrs, GridCachePartitionExchangeManager.class)); + } + finally { + stopAllGrids(); + } + } + + /** + * @param lsnrs Collection of listeners. + * @param cls Listener class. + * @return {@code true} if given collection contains expected listener, otherwise {@code false}. + */ + private boolean containsListener(Collection<EventListener> lsnrs, Class cls) { + for (Object wrapper : lsnrs) { + Object lsnr = GridTestUtils.getFieldValue(wrapper, "lsnr"); + + // We can't use 'instance of' or other reflection tools to check the type of class, because, service + // deployment discovery listener is a private non-static class, PME's listener is an anonymous class. + if (lsnr.getClass().getName().startsWith(cls.getName())) + return true; + } + + return false; + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/62c560a5/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentNonSerializableStaticConfigurationTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentNonSerializableStaticConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentNonSerializableStaticConfigurationTest.java new file mode 100644 index 0000000..4d08d10 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentNonSerializableStaticConfigurationTest.java @@ -0,0 +1,119 @@ +/* + * 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.processors.service; + +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.services.Service; +import org.apache.ignite.services.ServiceConfiguration; +import org.apache.ignite.services.ServiceContext; +import org.apache.ignite.testframework.ListeningTestLogger; +import org.apache.ignite.testframework.LogListener; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * + */ +@RunWith(JUnit4.class) +public class ServiceDeploymentNonSerializableStaticConfigurationTest extends GridCommonAbstractTest { + /** */ + private static final String TEST_SERVICE_NAME = "nonSerializableService"; + + /** */ + private final ListeningTestLogger log = new ListeningTestLogger(false, super.log); + + /** */ + @BeforeClass + public static void check() { + Assume.assumeTrue(isEventDrivenServiceProcessorEnabled()); + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + cfg.setGridLogger(log); + + ServiceConfiguration srvcCfg = new ServiceConfiguration(); + + srvcCfg.setName(TEST_SERVICE_NAME); + srvcCfg.setMaxPerNodeCount(1); + srvcCfg.setService(new NonSerializableService()); + + cfg.setServiceConfiguration(srvcCfg); + + return cfg; + } + + /** + * @throws Exception In case of an error. + */ + @Test + public void testNonSerializableStaticServiceValidationFailure() throws Exception { + LogListener lsnr = LogListener + .matches(s -> s.startsWith("Failed to marshal service with configured marshaller [name=" + TEST_SERVICE_NAME)) + .atLeast(2) + .build(); + + log.registerListener(lsnr); + + try { + startGrid(0); + + IgniteEx ignite = startGrid(1); + + assertEquals(2, ignite.context().discovery().topologyVersion()); + + assertTrue(lsnr.check()); + } + finally { + stopAllGrids(); + } + } + + /** */ + private static class NonSerializableService implements Service { + /** */ + @SuppressWarnings("unused") + private NonSerializableObject nonSerializableField = new NonSerializableObject(); + + /** {@inheritDoc} */ + @Override public void cancel(ServiceContext ctx) { + // No-op. + } + + /** {@inheritDoc} */ + @Override public void init(ServiceContext ctx) throws Exception { + // No-op. + } + + /** {@inheritDoc} */ + @Override public void execute(ServiceContext ctx) throws Exception { + // No-op. + } + } + + /** */ + private static class NonSerializableObject { + } +}
