You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/05/03 07:22:22 UTC
[44/50] [abbrv] ignite git commit: IGNITE-4920 Fixed.
IGNITE-4920 Fixed.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ead06b06
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ead06b06
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ead06b06
Branch: refs/heads/ignite-gg-8.0.3.ea6-clients-test
Commit: ead06b06f4b164998bfc5853dfa28cac4b618d8d
Parents: f2c9d6c
Author: Aleksei Scherbakov <al...@gmail.com>
Authored: Mon Apr 10 19:46:18 2017 +0300
Committer: Aleksei Scherbakov <al...@gmail.com>
Committed: Mon Apr 10 19:46:18 2017 +0300
----------------------------------------------------------------------
.../deployment/local/LocalDeploymentSpi.java | 12 +-
.../p2p/GridP2PLocalDeploymentSelfTest.java | 109 +++++++++++++++++++
2 files changed, 120 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/ead06b06/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
index 68ef178..87fa452 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
@@ -25,6 +25,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap;
import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.compute.ComputeTask;
import org.apache.ignite.compute.ComputeTaskName;
import org.apache.ignite.internal.util.GridAnnotationsCache;
@@ -68,6 +69,13 @@ import org.jsr166.ConcurrentLinkedHashMap;
@IgnoreIfPeerClassLoadingDisabled
public class LocalDeploymentSpi extends IgniteSpiAdapter implements DeploymentSpi, LocalDeploymentSpiMBean {
/** */
+ public static final String IGNITE_DEPLOYMENT_ADDITIONAL_CHECK = "ignite.deployment.additional.check";
+
+ /** */
+ private static final boolean ENABLE_IGNITE_DEPLOYMENT_ADDITIONAL_CHECK =
+ IgniteSystemProperties.getBoolean(IGNITE_DEPLOYMENT_ADDITIONAL_CHECK);
+
+ /** */
@SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized"})
@LoggerResource
private IgniteLogger log;
@@ -333,7 +341,9 @@ public class LocalDeploymentSpi extends IgniteSpiAdapter implements DeploymentSp
// Check classes with class loader only when classes points to classes to avoid redundant check.
// Resources map contains two entries for class with task name(alias).
if (entry.getKey().equals(entry.getValue()) && isResourceExist(ldr, entry.getKey()) &&
- !U.hasParent(clsLdrToIgnore, ldr) && ldrRsrcs.remove(ldr, clsLdrRsrcs)) {
+ !U.hasParent(clsLdrToIgnore, ldr) &&
+ (!ENABLE_IGNITE_DEPLOYMENT_ADDITIONAL_CHECK || clsLdrRsrcs.containsKey(entry.getKey())) &&
+ ldrRsrcs.remove(ldr, clsLdrRsrcs)) {
// Add class loaders in collection to notify listener outside synchronization block.
rmvClsLdrs.add(ldr);
http://git-wip-us.apache.org/repos/asf/ignite/blob/ead06b06/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PLocalDeploymentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PLocalDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PLocalDeploymentSelfTest.java
index 05f102c..8884ea8 100644
--- a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PLocalDeploymentSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PLocalDeploymentSelfTest.java
@@ -24,6 +24,9 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteException;
import org.apache.ignite.cluster.ClusterNode;
@@ -33,11 +36,17 @@ import org.apache.ignite.compute.ComputeJobResult;
import org.apache.ignite.compute.ComputeTaskAdapter;
import org.apache.ignite.configuration.DeploymentMode;
import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.util.lang.GridPeerDeployAware;
+import org.apache.ignite.lang.IgniteCallable;
import org.apache.ignite.resources.IgniteInstanceResource;
import org.apache.ignite.testframework.config.GridTestProperties;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.apache.ignite.testframework.junits.common.GridCommonTest;
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_CACHE_REMOVED_ENTRIES_TTL;
+import static org.apache.ignite.spi.deployment.local.LocalDeploymentSpi.IGNITE_DEPLOYMENT_ADDITIONAL_CHECK;
+
/**
* Test to make sure that if job executes on the same node, it reuses the same class loader as task.
*/
@@ -205,6 +214,106 @@ public class GridP2PLocalDeploymentSelfTest extends GridCommonAbstractTest {
}
/**
+ * Tests concurrent deployment using delegating classloader for the task.
+ */
+ public void testConcurrentDeploymentWithDelegatingClassloader() throws Exception {
+ depMode = DeploymentMode.SHARED;
+
+ // Force rmvQueue removal task to run very often.
+ System.setProperty(IGNITE_CACHE_REMOVED_ENTRIES_TTL, "1");
+ System.setProperty(IGNITE_DEPLOYMENT_ADDITIONAL_CHECK, "true");
+
+ try {
+ final Ignite ignite = startGrid();
+
+ final ClassLoader delegate = ignite.getClass().getClassLoader();
+
+ final ClassLoader root = new DelegateClassLoader(null, delegate);
+
+ final AtomicBoolean stop = new AtomicBoolean();
+
+ IgniteInternalFuture<?> fut = multithreadedAsync(new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ while (!stop.get()) {
+ final Class<?> clazz = root.loadClass("org.apache.ignite.p2p.GridP2PLocalDeploymentSelfTest$TestClosure");
+
+ ignite.compute().
+ call((IgniteCallable) clazz.getDeclaredConstructor(ClassLoader.class).newInstance(root));
+ }
+
+ return null;
+ }
+ }, 1);
+
+ ignite.scheduler().runLocal(new Runnable() {
+ @Override public void run() {
+ stop.set(true);
+ }
+ }, 10, TimeUnit.SECONDS);
+
+ fut.get();
+ } finally {
+ stopAllGrids();
+
+ System.clearProperty(IGNITE_CACHE_REMOVED_ENTRIES_TTL);
+ System.clearProperty(IGNITE_DEPLOYMENT_ADDITIONAL_CHECK);
+ }
+ }
+
+ /** */
+ private static class TestClosure implements IgniteCallable, GridPeerDeployAware {
+ /** */
+ transient ClassLoader clsLdr;
+
+ /**
+ * @param cls Class.
+ */
+ public TestClosure(ClassLoader cls) {
+ this.clsLdr = cls;
+ }
+
+ /** {@inheritDoc} */
+ public Object call() throws Exception {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ public Class<?> deployClass() {
+ return this.getClass();
+ }
+
+ /** {@inheritDoc} */
+ public ClassLoader classLoader() {
+ return clsLdr;
+ }
+ }
+
+ /** */
+ private static class DelegateClassLoader extends ClassLoader {
+ /** Delegate class loader. */
+ private ClassLoader delegateClsLdr;
+
+ /**
+ * @param parent Parent.
+ * @param delegateClsLdr Delegate class loader.
+ */
+ public DelegateClassLoader(ClassLoader parent, ClassLoader delegateClsLdr) {
+ super(parent); // Parent doesn't matter.
+ this.delegateClsLdr = delegateClsLdr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public URL getResource(String name) {
+ return delegateClsLdr.getResource(name);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<?> loadClass(String name) throws ClassNotFoundException {
+ return delegateClsLdr.loadClass(name);
+ }
+ }
+
+ /**
* Simple resource.
*/
public static class UserResource {