You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by av...@apache.org on 2016/06/22 10:02:15 UTC

[1/5] ignite git commit: IGNITE-3341: Hadoop: Added ability to link user-define native libraries to HadoopClassLoader.

Repository: ignite
Updated Branches:
  refs/heads/master 5b4ac3743 -> 41f81da8f


IGNITE-3341: Hadoop: Added ability to link user-define native libraries to HadoopClassLoader.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/68b25df3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/68b25df3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/68b25df3

Branch: refs/heads/master
Commit: 68b25df3b3e1979c0972d75675f2c9aa2b48d9a7
Parents: a527bf8
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Jun 21 16:57:28 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Jun 21 17:11:22 2016 +0300

----------------------------------------------------------------------
 .../configuration/HadoopConfiguration.java      | 35 ++++++++++++++++++++
 .../processors/hadoop/HadoopJobInfo.java        |  3 +-
 .../processors/hadoop/HadoopClassLoader.java    | 26 +++++++++++++--
 .../processors/hadoop/HadoopDefaultJobInfo.java |  8 ++---
 .../hadoop/jobtracker/HadoopJobTracker.java     | 14 ++++++--
 .../child/HadoopChildProcessRunner.java         |  2 +-
 .../processors/hadoop/v2/HadoopV2Job.java       | 14 ++++++--
 .../hadoop/HadoopClassLoaderTest.java           |  2 +-
 .../processors/hadoop/HadoopSnappyTest.java     |  2 +-
 .../processors/hadoop/HadoopTasksV1Test.java    |  2 +-
 .../processors/hadoop/HadoopTasksV2Test.java    |  2 +-
 .../processors/hadoop/HadoopV2JobSelfTest.java  |  2 +-
 .../collections/HadoopAbstractMapTest.java      |  6 ++--
 13 files changed, 96 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/core/src/main/java/org/apache/ignite/configuration/HadoopConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/HadoopConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/HadoopConfiguration.java
index 95ce9d3..5f68c84 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/HadoopConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/HadoopConfiguration.java
@@ -17,8 +17,10 @@
 
 package org.apache.ignite.configuration;
 
+import org.apache.ignite.lifecycle.LifecycleBean;
 import org.apache.ignite.internal.processors.hadoop.HadoopMapReducePlanner;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Ignite Hadoop Accelerator configuration.
@@ -51,6 +53,9 @@ public class HadoopConfiguration {
     /** */
     private int maxTaskQueueSize = DFLT_MAX_TASK_QUEUE_SIZE;
 
+    /** Library names. */
+    private String[] libNames;
+
     /**
      * Default constructor.
      */
@@ -71,6 +76,7 @@ public class HadoopConfiguration {
         planner = cfg.getMapReducePlanner();
         maxParallelTasks = cfg.getMaxParallelTasks();
         maxTaskQueueSize = cfg.getMaxTaskQueueSize();
+        libNames = cfg.getNativeLibraryNames();
     }
 
     /**
@@ -169,6 +175,35 @@ public class HadoopConfiguration {
         this.planner = planner;
     }
 
+    /**
+     * Get native library names.
+     * <p>
+     * Ignite Hadoop Accelerator executes all Hadoop jobs and tasks in the same process, isolating them with help
+     * of classloaders. If Hadoop job or task loads a native library, it might lead to exception, because Java do
+     * not allow to load the same library multiple times from different classloaders. To overcome the problem,
+     * you should to the following:
+     * <ul>
+     *     <li>Load necessary libraries in advance from base classloader; {@link LifecycleBean} is a good candidate
+     *     for this;</li>
+     *     <li>Add names of loaded libraries to this property, so that Hadoop engine is able to link them;</li>
+     *     <li>Remove {@link System#load(String)} and {@link System#loadLibrary(String)} calls from your job/task.</li>     *
+     * </ul>
+     *
+     * @return Native library names.
+     */
+    @Nullable public String[] getNativeLibraryNames() {
+        return libNames;
+    }
+
+    /**
+     * Set native library names. See {@link #getNativeLibraryNames()} for more information.
+     *
+     * @param libNames Native library names.
+     */
+    public void setNativeLibraryNames(@Nullable String... libNames) {
+        this.libNames = libNames;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(HadoopConfiguration.class, this, super.toString());

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/core/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopJobInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopJobInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopJobInfo.java
index eda8e97..a3b1bb6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopJobInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopJobInfo.java
@@ -58,11 +58,12 @@ public interface HadoopJobInfo extends Serializable {
      * @param jobCls The job class.
      * @param jobId Job ID.
      * @param log Logger.
+     * @param libNames Optional additional native library names.
      * @return Job.
      * @throws IgniteCheckedException If failed.
      */
     public HadoopJob createJob(Class<? extends HadoopJob> jobCls,
-        HadoopJobId jobId, IgniteLogger log) throws IgniteCheckedException;
+        HadoopJobId jobId, IgniteLogger log, @Nullable String[] libNames) throws IgniteCheckedException;
 
     /**
      * @return Number of reducers configured for job.

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
index 4448b2d..340b35b 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
@@ -99,6 +99,9 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache {
     @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
     private final String name;
 
+    /** Native library names. */
+    private final String[] libNames;
+
     /**
      * Gets name for Job class loader. The name is specific for local node id.
      * @param locNodeId The local node id.
@@ -122,14 +125,19 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache {
     }
 
     /**
+     * Constructor.
+     *
      * @param urls Urls.
+     * @param name Classloader name.
+     * @param libNames Optional additional native library names to be linked from parent classloader.
      */
-    public HadoopClassLoader(URL[] urls, String name) {
+    public HadoopClassLoader(URL[] urls, String name, @Nullable String[] libNames) {
         super(addHadoopUrls(urls), APP_CLS_LDR);
 
         assert !(getParent() instanceof HadoopClassLoader);
 
         this.name = name;
+        this.libNames = libNames;
 
         initializeNativeLibraries();
     }
@@ -159,9 +167,21 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache {
                 Vector vector = U.field(ldr, "nativeLibraries");
 
                 for (Object lib : vector) {
-                    String libName = U.field(lib, "name");
+                    String name = U.field(lib, "name");
+
+                    boolean add = name.contains(LIBHADOOP);
+
+                    if (!add && libNames != null) {
+                        for (String libName : libNames) {
+                            if (libName != null && name.contains(libName)) {
+                                add = true;
+
+                                break;
+                            }
+                        }
+                    }
 
-                    if (libName.contains(LIBHADOOP)) {
+                    if (add) {
                         curVector.add(lib);
 
                         return;

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultJobInfo.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultJobInfo.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultJobInfo.java
index fe125fe..be2d9ca 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultJobInfo.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultJobInfo.java
@@ -82,15 +82,15 @@ public class HadoopDefaultJobInfo implements HadoopJobInfo, Externalizable {
     }
 
     /** {@inheritDoc} */
-    @Override public HadoopJob createJob(Class<? extends HadoopJob> jobCls,
-            HadoopJobId jobId, IgniteLogger log) throws IgniteCheckedException {
+    @Override public HadoopJob createJob(Class<? extends HadoopJob> jobCls, HadoopJobId jobId, IgniteLogger log,
+        @Nullable String[] libNames) throws IgniteCheckedException {
         assert jobCls != null;
 
         try {
             Constructor<? extends HadoopJob> constructor = jobCls.getConstructor(HadoopJobId.class,
-                HadoopDefaultJobInfo.class, IgniteLogger.class);
+                HadoopDefaultJobInfo.class, IgniteLogger.class, String[].class);
 
-            return constructor.newInstance(jobId, this, log);
+            return constructor.newInstance(jobId, this, log, libNames);
         }
         // NB: java.lang.NoClassDefFoundError may be thrown from Class#getConstructor() call.
         catch (Throwable t) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/jobtracker/HadoopJobTracker.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/jobtracker/HadoopJobTracker.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/jobtracker/HadoopJobTracker.java
index cdd8103..f3e17f3 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/jobtracker/HadoopJobTracker.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/jobtracker/HadoopJobTracker.java
@@ -157,7 +157,12 @@ public class HadoopJobTracker extends HadoopComponent {
 
         assert jobCls == null;
 
-        HadoopClassLoader ldr = new HadoopClassLoader(null, HadoopClassLoader.nameForJob(nodeId));
+        String[] libNames = null;
+
+        if (ctx.configuration() != null)
+            libNames = ctx.configuration().getNativeLibraryNames();
+
+        HadoopClassLoader ldr = new HadoopClassLoader(null, HadoopClassLoader.nameForJob(nodeId), libNames);
 
         try {
             jobCls = (Class<HadoopV2Job>)ldr.loadClass(HadoopV2Job.class.getName());
@@ -727,6 +732,7 @@ public class HadoopJobTracker extends HadoopComponent {
      * @param jobId  Job ID.
      * @param plan Map-reduce plan.
      */
+    @SuppressWarnings({"unused", "ConstantConditions" })
     private void printPlan(HadoopJobId jobId, HadoopMapReducePlan plan) {
         log.info("Plan for " + jobId);
 
@@ -886,6 +892,8 @@ public class HadoopJobTracker extends HadoopComponent {
                     finishFut.onDone(jobId, meta.failCause());
                 }
 
+                assert job != null;
+
                 if (ctx.jobUpdateLeader())
                     job.cleanupStagingDirectory();
 
@@ -1052,7 +1060,7 @@ public class HadoopJobTracker extends HadoopComponent {
                 jobInfo = meta.jobInfo();
             }
 
-            job = jobInfo.createJob(jobCls, jobId, log);
+            job = jobInfo.createJob(jobCls, jobId, log, ctx.configuration().getNativeLibraryNames());
 
             job.initialize(false, ctx.localNodeId());
 
@@ -1667,7 +1675,7 @@ public class HadoopJobTracker extends HadoopComponent {
             if (val != null)
                 e.setValue(val);
             else
-                e.remove();;
+                e.remove();
 
             return null;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/taskexecutor/external/child/HadoopChildProcessRunner.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/taskexecutor/external/child/HadoopChildProcessRunner.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/taskexecutor/external/child/HadoopChildProcessRunner.java
index a949141..4a946e9 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/taskexecutor/external/child/HadoopChildProcessRunner.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/taskexecutor/external/child/HadoopChildProcessRunner.java
@@ -134,7 +134,7 @@ public class HadoopChildProcessRunner {
 
                 assert job == null;
 
-                job = req.jobInfo().createJob(HadoopV2Job.class, req.jobId(), log);
+                job = req.jobInfo().createJob(HadoopV2Job.class, req.jobId(), log, null);
 
                 job.initialize(true, nodeDesc.processId());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/v2/HadoopV2Job.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/v2/HadoopV2Job.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/v2/HadoopV2Job.java
index b69447d..8804e29 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/v2/HadoopV2Job.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/v2/HadoopV2Job.java
@@ -93,6 +93,9 @@ public class HadoopV2Job implements HadoopJob {
     /** Job info. */
     protected final HadoopJobInfo jobInfo;
 
+    /** Native library names. */
+    private final String[] libNames;
+
     /** */
     private final JobID hadoopJobID;
 
@@ -119,16 +122,21 @@ public class HadoopV2Job implements HadoopJob {
     private volatile byte[] jobConfData;
 
     /**
+     * Constructor.
+     *
      * @param jobId Job ID.
      * @param jobInfo Job info.
      * @param log Logger.
+     * @param libNames Optional additional native library names.
      */
-    public HadoopV2Job(HadoopJobId jobId, final HadoopDefaultJobInfo jobInfo, IgniteLogger log) {
+    public HadoopV2Job(HadoopJobId jobId, final HadoopDefaultJobInfo jobInfo, IgniteLogger log,
+        @Nullable String[] libNames) {
         assert jobId != null;
         assert jobInfo != null;
 
         this.jobId = jobId;
         this.jobInfo = jobInfo;
+        this.libNames = libNames;
 
         hadoopJobID = new JobID(jobId.globalId().toString(), jobId.localId());
 
@@ -220,7 +228,7 @@ public class HadoopV2Job implements HadoopJob {
     }
 
     /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({"unchecked", "MismatchedQueryAndUpdateOfCollection" })
     @Override public HadoopTaskContext getTaskContext(HadoopTaskInfo info) throws IgniteCheckedException {
         T2<HadoopTaskType, Integer> locTaskId = new T2<>(info.type(),  info.taskNumber());
 
@@ -242,7 +250,7 @@ public class HadoopV2Job implements HadoopJob {
                 // Note that the classloader identified by the task it was initially created for,
                 // but later it may be reused for other tasks.
                 HadoopClassLoader ldr = new HadoopClassLoader(rsrcMgr.classPath(),
-                    HadoopClassLoader.nameForTask(info, false));
+                    HadoopClassLoader.nameForTask(info, false), libNames);
 
                 cls = (Class<? extends HadoopTaskContext>)ldr.loadClass(HadoopV2TaskContext.class.getName());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
index 55fac2c..02d98d0 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
@@ -49,7 +49,7 @@ import org.apache.ignite.internal.processors.hadoop.deps.Without;
  */
 public class HadoopClassLoaderTest extends TestCase {
     /** */
-    final HadoopClassLoader ldr = new HadoopClassLoader(null, "test");
+    final HadoopClassLoader ldr = new HadoopClassLoader(null, "test", null);
 
     /**
      * @throws Exception If failed.

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java
index 014ff1e..b4e3dc2 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java
@@ -49,7 +49,7 @@ public class HadoopSnappyTest extends GridCommonAbstractTest {
 
         // Run the same in several more class loaders simulating jobs and tasks:
         for (int i = 0; i < 2; i++) {
-            ClassLoader hadoopClsLdr = new HadoopClassLoader(null, "cl-" + i);
+            ClassLoader hadoopClsLdr = new HadoopClassLoader(null, "cl-" + i, null);
 
             Class<?> cls = (Class)Class.forName(HadoopSnappyTest.class.getName(), true, hadoopClsLdr);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV1Test.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV1Test.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV1Test.java
index 6ba9686..27d7fc2 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV1Test.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV1Test.java
@@ -48,7 +48,7 @@ public class HadoopTasksV1Test extends HadoopTasksAllVersionsTest {
 
         HadoopJobId jobId = new HadoopJobId(uuid, 0);
 
-        return jobInfo.createJob(HadoopV2Job.class, jobId, log);
+        return jobInfo.createJob(HadoopV2Job.class, jobId, log, null);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV2Test.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV2Test.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV2Test.java
index d125deb..30cf50c 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV2Test.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTasksV2Test.java
@@ -67,7 +67,7 @@ public class HadoopTasksV2Test extends HadoopTasksAllVersionsTest {
 
         HadoopJobId jobId = new HadoopJobId(uuid, 0);
 
-        return jobInfo.createJob(HadoopV2Job.class, jobId, log);
+        return jobInfo.createJob(HadoopV2Job.class, jobId, log, null);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopV2JobSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopV2JobSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopV2JobSelfTest.java
index 1e9ffbc..ae2c00d 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopV2JobSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopV2JobSelfTest.java
@@ -78,7 +78,7 @@ public class HadoopV2JobSelfTest extends HadoopAbstractSelfTest {
 
         HadoopJobId id = new HadoopJobId(uuid, 1);
 
-        HadoopJob job = info.createJob(HadoopV2Job.class, id, log);
+        HadoopJob job = info.createJob(HadoopV2Job.class, id, log, null);
 
         HadoopTaskContext taskCtx = job.getTaskContext(new HadoopTaskInfo(HadoopTaskType.MAP, null, 0, 0,
             null));

http://git-wip-us.apache.org/repos/asf/ignite/blob/68b25df3/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/shuffle/collections/HadoopAbstractMapTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/shuffle/collections/HadoopAbstractMapTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/shuffle/collections/HadoopAbstractMapTest.java
index 493098f..5266875 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/shuffle/collections/HadoopAbstractMapTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/shuffle/collections/HadoopAbstractMapTest.java
@@ -77,11 +77,13 @@ public abstract class HadoopAbstractMapTest extends GridCommonAbstractTest {
         }
 
         /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
         @Override public Comparator<Object> sortComparator() {
             return ComparableComparator.getInstance();
         }
 
         /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
         @Override public Comparator<Object> groupComparator() {
             return ComparableComparator.getInstance();
         }
@@ -141,8 +143,8 @@ public abstract class HadoopAbstractMapTest extends GridCommonAbstractTest {
         }
 
         /** {@inheritDoc} */
-        @Override public HadoopJob createJob(Class<? extends HadoopJob> jobCls,
-                HadoopJobId jobId, IgniteLogger log) throws IgniteCheckedException {
+        @Override public HadoopJob createJob(Class<? extends HadoopJob> jobCls, HadoopJobId jobId, IgniteLogger log,
+            @Nullable String[] libNames) throws IgniteCheckedException {
             assert false;
 
             return null;


[5/5] ignite git commit: Merge remote-tracking branch 'remotes/upstream/gridgain-7.6.1'

Posted by av...@apache.org.
Merge remote-tracking branch 'remotes/upstream/gridgain-7.6.1'


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/41f81da8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/41f81da8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/41f81da8

Branch: refs/heads/master
Commit: 41f81da8f7efe629affc1cfae52ed1d8820a1043
Parents: 5b4ac37 8ce29a9
Author: Anton Vinogradov <av...@apache.org>
Authored: Wed Jun 22 13:01:23 2016 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Jun 22 13:01:23 2016 +0300

----------------------------------------------------------------------
 .../configuration/HadoopConfiguration.java      | 35 +++++++
 .../processors/hadoop/HadoopJobInfo.java        |  3 +-
 .../ignite/internal/util/IgniteUtils.java       | 45 +++++++--
 .../ignite/spi/discovery/tcp/ServerImpl.java    |  7 +-
 .../spi/discovery/tcp/TcpDiscoveryImpl.java     |  3 +-
 .../cluster/GridAddressResolverSelfTest.java    | 97 ++++++++++++++++++++
 .../vm/TcpDiscoveryVmIpFinderSelfTest.java      | 75 +++++++++++++++
 .../testsuites/IgniteKernalSelfTestSuite.java   |  2 +
 .../processors/hadoop/HadoopClassLoader.java    | 26 +++++-
 .../processors/hadoop/HadoopDefaultJobInfo.java |  8 +-
 .../hadoop/jobtracker/HadoopJobTracker.java     | 14 ++-
 .../child/HadoopChildProcessRunner.java         |  2 +-
 .../processors/hadoop/v2/HadoopV2Job.java       | 14 ++-
 .../hadoop/HadoopClassLoaderTest.java           |  2 +-
 .../processors/hadoop/HadoopSnappyTest.java     |  2 +-
 .../processors/hadoop/HadoopTasksV1Test.java    |  2 +-
 .../processors/hadoop/HadoopTasksV2Test.java    |  2 +-
 .../processors/hadoop/HadoopV2JobSelfTest.java  |  2 +-
 .../collections/HadoopAbstractMapTest.java      |  6 +-
 19 files changed, 312 insertions(+), 35 deletions(-)
----------------------------------------------------------------------



[2/5] ignite git commit: Merge remote-tracking branch 'upstream/gridgain-7.6.1' into gridgain-7.6.1

Posted by av...@apache.org.
Merge remote-tracking branch 'upstream/gridgain-7.6.1' into gridgain-7.6.1


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3ca0bc87
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3ca0bc87
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3ca0bc87

Branch: refs/heads/master
Commit: 3ca0bc877bf356eca93c9c9a5e225362c2b58769
Parents: 68b25df 482015e
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Jun 21 17:11:37 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Jun 21 17:11:37 2016 +0300

----------------------------------------------------------------------
 modules/clients/pom.xml                         |    8 -
 .../client/ClientDefaultCacheSelfTest.java      |  119 +-
 .../ignite/internal/client/ClientHttpTask.java  |   33 +-
 .../ignite/internal/client/ClientTcpTask.java   |   10 +-
 .../integration/ClientAbstractSelfTest.java     |   92 +-
 .../JettyRestProcessorAbstractSelfTest.java     | 1018 ++++++++----------
 .../internal/processors/rest/SimplePerson.java  |   74 ++
 modules/core/pom.xml                            |   15 +-
 .../apache/ignite/internal/LessNamingBean.java  |   28 +
 .../ignite/internal/MarshallerContextImpl.java  |   29 +-
 .../cache/query/GridCacheSqlIndexMetadata.java  |    3 +-
 .../cache/query/GridCacheSqlMetadata.java       |    3 +-
 .../internal/util/IgniteExceptionRegistry.java  |    5 +-
 .../ignite/internal/visor/cache/VisorCache.java |    4 +-
 .../cache/VisorCacheAffinityConfiguration.java  |    5 +-
 .../cache/VisorCacheAggregatedMetrics.java      |    3 +-
 .../visor/cache/VisorCacheConfiguration.java    |    3 +-
 .../cache/VisorCacheDefaultConfiguration.java   |    5 +-
 .../cache/VisorCacheEvictionConfiguration.java  |    5 +-
 .../internal/visor/cache/VisorCacheMetrics.java |    3 +-
 .../cache/VisorCacheNearConfiguration.java      |    5 +-
 .../visor/cache/VisorCachePartition.java        |    3 +-
 .../visor/cache/VisorCachePartitions.java       |    3 +-
 .../cache/VisorCacheQueryConfiguration.java     |    3 +-
 .../visor/cache/VisorCacheQueryMetrics.java     |    5 +-
 .../cache/VisorCacheRebalanceConfiguration.java |    5 +-
 .../cache/VisorCacheStoreConfiguration.java     |    3 +-
 .../cache/VisorCacheTypeFieldMetadata.java      |    3 +-
 .../visor/cache/VisorCacheTypeMetadata.java     |    3 +-
 .../internal/visor/cache/VisorCacheV4.java      |  124 +++
 .../internal/visor/debug/VisorThreadInfo.java   |    5 +-
 .../visor/debug/VisorThreadLockInfo.java        |    5 +-
 .../internal/visor/event/VisorGridEvent.java    |    5 +-
 .../internal/visor/file/VisorFileBlock.java     |    5 +-
 .../ignite/internal/visor/igfs/VisorIgfs.java   |    5 +-
 .../internal/visor/igfs/VisorIgfsEndpoint.java  |    5 +-
 .../internal/visor/igfs/VisorIgfsMetrics.java   |    5 +-
 .../visor/igfs/VisorIgfsProfilerEntry.java      |    5 +-
 .../VisorIgfsProfilerUniformityCounters.java    |    5 +-
 .../visor/log/VisorLogSearchResult.java         |    5 +-
 .../visor/node/VisorAtomicConfiguration.java    |    5 +-
 .../visor/node/VisorBasicConfiguration.java     |    5 +-
 .../node/VisorExecutorServiceConfiguration.java |    5 +-
 .../visor/node/VisorGridConfiguration.java      |    5 +-
 .../visor/node/VisorIgfsConfiguration.java      |    3 +-
 .../visor/node/VisorLifecycleConfiguration.java |    5 +-
 .../visor/node/VisorMetricsConfiguration.java   |    5 +-
 .../visor/node/VisorNodeDataCollectorJob.java   |   26 +-
 .../node/VisorNodeDataCollectorTaskResult.java  |    5 +-
 .../node/VisorPeerToPeerConfiguration.java      |    5 +-
 .../visor/node/VisorRestConfiguration.java      |    5 +-
 .../node/VisorSegmentationConfiguration.java    |    5 +-
 .../visor/node/VisorSpisConfiguration.java      |    5 +-
 .../node/VisorTransactionConfiguration.java     |    5 +-
 .../internal/visor/query/VisorQueryField.java   |    5 +-
 .../internal/visor/query/VisorQueryResult.java  |    5 +-
 .../plugin/security/SecurityPermissionSet.java  |    5 +-
 .../ignite/plugin/security/SecuritySubject.java |    5 +-
 modules/rest-http/pom.xml                       |   25 +-
 .../http/jetty/GridJettyJsonConfig.java         |  317 ------
 .../http/jetty/GridJettyObjectMapper.java       |  274 +++++
 .../http/jetty/GridJettyRestHandler.java        |  127 +--
 .../IgniteCacheRandomOperationBenchmark.java    |  539 +++++-----
 .../cache/load/model/key/Identifier.java        |    6 +
 .../yardstick/cache/load/model/key/Mark.java    |    7 +
 .../yardstick/cache/load/model/value/Car.java   |    6 +
 .../yardstick/cache/load/model/value/Truck.java |   12 +-
 .../ignite/yardstick/cache/model/Account.java   |    6 +
 .../ignite/yardstick/cache/model/Person1.java   |    2 +-
 .../ignite/yardstick/cache/model/Person2.java   |    2 +-
 .../ignite/yardstick/cache/model/SampleKey.java |    2 +-
 .../yardstick/cache/model/SampleValue.java      |    2 +-
 .../zk/TcpDiscoveryZookeeperIpFinder.java       |   19 +-
 parent/pom.xml                                  |    1 +
 74 files changed, 1673 insertions(+), 1455 deletions(-)
----------------------------------------------------------------------



[4/5] ignite git commit: IGNITE-3152 Client node's addresses are registered in IP finder

Posted by av...@apache.org.
IGNITE-3152 Client node's addresses are registered in IP finder


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8ce29a92
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8ce29a92
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8ce29a92

Branch: refs/heads/master
Commit: 8ce29a92d5e06d5a3d68aae0f6a2865ffd21a28c
Parents: 5177c33
Author: Anton Vinogradov <av...@apache.org>
Authored: Wed Jun 22 12:43:05 2016 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Jun 22 12:58:10 2016 +0300

----------------------------------------------------------------------
 .../ignite/spi/discovery/tcp/ServerImpl.java    |  2 +-
 .../vm/TcpDiscoveryVmIpFinderSelfTest.java      | 75 ++++++++++++++++++++
 2 files changed, 76 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/8ce29a92/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 38ed671..b1c56c0 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
@@ -4035,7 +4035,7 @@ class ServerImpl extends TcpDiscoveryImpl {
                     notifyDiscovery(EVT_NODE_JOINED, topVer, node);
 
                 try {
-                    if (spi.ipFinder.isShared() && locNodeCoord)
+                    if (spi.ipFinder.isShared() && locNodeCoord && !node.isClient())
                         spi.ipFinder.registerAddresses(node.socketAddresses());
                 }
                 catch (IgniteSpiException e) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/8ce29a92/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
index 86587ba..aa00007 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
@@ -19,8 +19,16 @@ package org.apache.ignite.spi.discovery.tcp.ipfinder.vm;
 
 import java.util.Arrays;
 import java.util.Collections;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.internal.util.typedef.G;
 import org.apache.ignite.spi.IgniteSpiException;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinderAbstractSelfTest;
+import org.apache.ignite.testframework.GridTestUtils;
+
+import static org.apache.ignite.internal.processors.cache.binary.GridCacheBinaryObjectsAbstractSelfTest.IP_FINDER;
 
 /**
  * GridTcpDiscoveryVmIpFinder test.
@@ -190,4 +198,71 @@ public class TcpDiscoveryVmIpFinderSelfTest
         assertEquals("Registered addresses: " + finder.getRegisteredAddresses().toString(),
             10, finder.getRegisteredAddresses().size());
     }
+
+    /**
+     *
+     */
+    public void testUnregistration() throws Exception {
+        Ignition.start(config("server1", false, false));
+
+        int srvSize = IP_FINDER.getRegisteredAddresses().size();
+
+        Ignition.start(config("server2", false, false));
+        Ignition.start(config("client1", true, false));
+
+        assertEquals(2 * srvSize, IP_FINDER.getRegisteredAddresses().size());
+
+        Ignition.start(config("client2", true, false));
+        Ignition.start(config("client3", true, false));
+
+        assertEquals(2 * srvSize, IP_FINDER.getRegisteredAddresses().size());
+
+        Ignition.start(config("client4", true, true));
+
+        assertEquals(3 * srvSize, IP_FINDER.getRegisteredAddresses().size());
+
+        Ignition.stop("client1", true);
+        Ignition.stop("client2", true);
+
+        assertEquals(3 * srvSize, IP_FINDER.getRegisteredAddresses().size());
+
+        Ignition.stop("client4", true);
+
+        GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                return 2 == G.allGrids().size();
+            }
+        }, 10000);
+
+        Ignition.stop("server1", true);
+        Ignition.stop("server2", true);
+
+        GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                return 0 == G.allGrids().size();
+            }
+        }, 10000);
+
+        assertTrue(3 * srvSize >= IP_FINDER.getRegisteredAddresses().size());
+    }
+
+    /**
+     * @param name Name.
+     * @param client Client.
+     */
+    private static IgniteConfiguration config(String name, boolean client, boolean forceServerMode) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(name);
+        cfg.setClientMode(client);
+
+        TcpDiscoverySpi disco = new TcpDiscoverySpi();
+
+        disco.setForceServerMode(forceServerMode);
+        disco.setIpFinder(IP_FINDER);
+
+        cfg.setDiscoverySpi(disco);
+
+        return cfg;
+    }
 }
\ No newline at end of file


[3/5] ignite git commit: IGNITE-3230 External addresses are not registered in IP finder

Posted by av...@apache.org.
IGNITE-3230 External addresses are not registered in IP finder


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5177c33e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5177c33e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5177c33e

Branch: refs/heads/master
Commit: 5177c33ec66d98ae379f2908dc056f58ee3cbb40
Parents: 3ca0bc8
Author: Anton Vinogradov <av...@apache.org>
Authored: Wed Jun 22 12:13:30 2016 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Jun 22 12:56:16 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/util/IgniteUtils.java       | 45 +++++++--
 .../ignite/spi/discovery/tcp/ServerImpl.java    |  5 +-
 .../spi/discovery/tcp/TcpDiscoveryImpl.java     |  3 +-
 .../cluster/GridAddressResolverSelfTest.java    | 97 ++++++++++++++++++++
 .../testsuites/IgniteKernalSelfTestSuite.java   |  2 +
 5 files changed, 140 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/5177c33e/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 2a83ad4..fee4f378 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -8686,16 +8686,10 @@ public abstract class IgniteUtils {
             InetSocketAddress sockAddr = new InetSocketAddress(addr, port);
 
             if (!sockAddr.isUnresolved()) {
-                try {
-                    Collection<InetSocketAddress> extAddrs0 = addrRslvr.getExternalAddresses(sockAddr);
+                Collection<InetSocketAddress> extAddrs0 = resolveAddress(addrRslvr, sockAddr);
 
-                    if (extAddrs0 != null)
-                        extAddrs.addAll(extAddrs0);
-                }
-                catch (IgniteCheckedException e) {
-                    throw new IgniteSpiException("Failed to get mapped external addresses " +
-                        "[addrRslvr=" + addrRslvr + ", addr=" + addr + ']', e);
-                }
+                if (extAddrs0 != null)
+                    extAddrs.addAll(extAddrs0);
             }
         }
 
@@ -8703,6 +8697,39 @@ public abstract class IgniteUtils {
     }
 
     /**
+     * @param addrRslvr Address resolver.
+     * @param sockAddr Addresses.
+     * @return Resolved addresses.
+     */
+    public static Collection<InetSocketAddress> resolveAddresses(AddressResolver addrRslvr,
+        Collection<InetSocketAddress> sockAddr) {
+        if (addrRslvr == null)
+            return sockAddr;
+
+        Collection<InetSocketAddress> resolved = new HashSet<>();
+
+        for (InetSocketAddress address :sockAddr)
+            resolved.addAll(resolveAddress(addrRslvr, address));
+
+        return resolved;
+    }
+
+    /**
+     * @param addrRslvr Address resolver.
+     * @param sockAddr Addresses.
+     * @return Resolved addresses.
+     */
+    private static Collection<InetSocketAddress> resolveAddress(AddressResolver addrRslvr, InetSocketAddress sockAddr) {
+        try {
+            return addrRslvr.getExternalAddresses(sockAddr);
+        }
+        catch (IgniteCheckedException e) {
+            throw new IgniteSpiException("Failed to get mapped external addresses " +
+                "[addrRslvr=" + addrRslvr + ", addr=" + sockAddr + ']', e);
+        }
+    }
+
+    /**
      * Returns string representation of node addresses.
      *
      * @param node Grid node.

http://git-wip-us.apache.org/repos/asf/ignite/blob/5177c33e/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 37a1539..38ed671 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
@@ -132,10 +132,10 @@ import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessa
 import org.jetbrains.annotations.Nullable;
 import org.jsr166.ConcurrentHashMap8;
 
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_DISCOVERY_HISTORY_SIZE;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_SERVICES_COMPATIBILITY_MODE;
-import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2;
 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;
@@ -4100,7 +4100,8 @@ class ServerImpl extends TcpDiscoveryImpl {
                 if (msg.verified() || !ring.hasRemoteNodes() || msg.senderNodeId() != null) {
                     if (spi.ipFinder.isShared() && !ring.hasRemoteNodes()) {
                         try {
-                            spi.ipFinder.unregisterAddresses(locNode.socketAddresses());
+                            spi.ipFinder.unregisterAddresses(
+                                U.resolveAddresses(spi.getAddressResolver(), locNode.socketAddresses()));
                         }
                         catch (IgniteSpiException e) {
                             U.error(log, "Failed to unregister local node address from IP finder.", e);

http://git-wip-us.apache.org/repos/asf/ignite/blob/5177c33e/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
index 41086d1..30b83e5 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
@@ -265,7 +265,8 @@ abstract class TcpDiscoveryImpl {
 
         while (true) {
             try {
-                spi.ipFinder.initializeLocalAddresses(locNode.socketAddresses());
+                spi.ipFinder.initializeLocalAddresses(
+                    U.resolveAddresses(spi.getAddressResolver(), locNode.socketAddresses()));
 
                 // Success.
                 break;

http://git-wip-us.apache.org/repos/asf/ignite/blob/5177c33e/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/GridAddressResolverSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/GridAddressResolverSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/GridAddressResolverSelfTest.java
new file mode 100644
index 0000000..d8fd767
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/GridAddressResolverSelfTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.configuration.AddressResolver;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+/**
+ * Address Resolver test.
+ */
+@GridCommonTest(group = "Kernal Self")
+public class GridAddressResolverSelfTest extends GridCommonAbstractTest {
+    /** */
+    private final InetSocketAddress addr0 = new InetSocketAddress("test0.com", 5000);
+
+    /** */
+    private final InetSocketAddress addr1 = new InetSocketAddress("test1.com", 5000);
+
+    /** Ip finder. */
+    private static final TcpDiscoveryVmIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(final String gridName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
+        discoSpi.setIpFinder(IP_FINDER);
+        cfg.setDiscoverySpi(discoSpi);
+
+        cfg.setAddressResolver(new AddressResolver() {
+            @Override public Collection<InetSocketAddress> getExternalAddresses(
+                InetSocketAddress addr) throws IgniteCheckedException {
+                Set<InetSocketAddress> set = new HashSet<>();
+
+                set.add(addr);
+                set.add(gridName.contains("0") ? addr0 : addr1);
+
+                return set;
+            }
+        });
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        stopAllGrids();
+    }
+
+    /** */
+    public void test() throws Exception {
+        startGrid(0);
+
+        assertFalse(IP_FINDER.getRegisteredAddresses().contains(addr1));
+
+        startGrid(1);
+
+        assertTrue(IP_FINDER.getRegisteredAddresses().contains(addr0));
+        assertTrue(IP_FINDER.getRegisteredAddresses().contains(addr1));
+
+        stopGrid(0, true);
+
+        assertTrue(GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                return !IP_FINDER.getRegisteredAddresses().contains(addr0);
+            }
+        }, 70000));
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/5177c33e/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java
index 620c298..c9cb531 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java
@@ -46,6 +46,7 @@ import org.apache.ignite.internal.managers.discovery.GridDiscoveryManagerSelfTes
 import org.apache.ignite.internal.managers.discovery.IgniteTopologyPrintFormatSelfTest;
 import org.apache.ignite.internal.managers.events.GridEventStorageManagerSelfTest;
 import org.apache.ignite.internal.managers.swapspace.GridSwapSpaceManagerSelfTest;
+import org.apache.ignite.internal.processors.cluster.GridAddressResolverSelfTest;
 import org.apache.ignite.internal.processors.cluster.GridUpdateNotifierSelfTest;
 import org.apache.ignite.internal.processors.port.GridPortProcessorSelfTest;
 import org.apache.ignite.internal.processors.service.GridServiceClientNodeTest;
@@ -121,6 +122,7 @@ public class IgniteKernalSelfTestSuite extends TestSuite {
         suite.addTestSuite(GridKernalConcurrentAccessStopSelfTest.class);
         suite.addTestSuite(IgniteConcurrentEntryProcessorAccessStopTest.class);
         suite.addTestSuite(GridUpdateNotifierSelfTest.class);
+        suite.addTestSuite(GridAddressResolverSelfTest.class);
         suite.addTestSuite(IgniteUpdateNotifierPerClusterSettingSelfTest.class);
         suite.addTestSuite(GridLocalEventListenerSelfTest.class);
         suite.addTestSuite(IgniteTopologyPrintFormatSelfTest.class);