3929: wip, current state.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/83ff85f3 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/83ff85f3 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/83ff85f3 Branch: refs/heads/ignite-3929-1 Commit: 83ff85f3babd3bedb70fda86703146d2ada393a0 Parents: df3ad76 Author: iveselovskiy <iveselovs...@gridgain.com> Authored: Tue Sep 20 16:03:35 2016 +0300 Committer: iveselovskiy <iveselovs...@gridgain.com> Committed: Tue Sep 20 16:03:35 2016 +0300 ---------------------------------------------------------------------- .../processors/hadoop/HadoopSnappyTest.java | 2 +- .../processors/hadoop/HadoopClassLoader.java | 51 ++++++++++++++------ .../internal/processors/hadoop/LoadHelper.java | 31 +++++++----- 3 files changed, 56 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/83ff85f3/modules/hadoop-impl/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java ---------------------------------------------------------------------- diff --git a/modules/hadoop-impl/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java b/modules/hadoop-impl/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java index 0b86c50..ca47334 100644 --- a/modules/hadoop-impl/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java +++ b/modules/hadoop-impl/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopSnappyTest.java @@ -58,7 +58,7 @@ public class HadoopSnappyTest extends GridCommonAbstractTest { U.invoke(cls, null, "checkSnappy"); } - //checkSnappy(); + checkSnappy(); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/83ff85f3/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 c6d2296..276b22d 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 @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.hadoop; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; @@ -114,6 +115,8 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache { return "hadoop-task-" + info.jobId() + "-" + info.type() + "-" + info.taskNumber(); } + private static final String[] DEFAULT_OPTIONAL_LIBS_TO_BE_LOADED = { "hadoop" }; + /** * Constructor. * @@ -202,20 +205,30 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache { * be loaded only once. */ private static void setNativeLibrariesToBeInjectedIfNeeded(HadoopClassLoader instance, String[] libs) { + System.out.println("### Loading libs: " + libs); + if (libs == null) return; - - boolean created = false; +// +// boolean created = false; // 1. If needed, init the native lib data collection: if (nativeLibrariesToBeInjected == null) { synchronized (HadoopClassLoader.class) { if (nativeLibrariesToBeInjected == null) { + LinkedHashSet<Object> natives0 = getNativeLibraries(APP_CLS_LDR); + instance.runLoadingCode(libs); - nativeLibrariesToBeInjected = instance.collectNativeLibraries(); + LinkedHashSet<Object> natives1 = getNativeLibraries(APP_CLS_LDR); - created = true; + natives1.removeAll(natives0); + + nativeLibrariesToBeInjected = Collections.unmodifiableCollection(natives1); + + System.out.println("### Collected loaded libraries: " + nativeLibrariesToBeInjected); +// +// created = true; } } } @@ -223,9 +236,19 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache { assert nativeLibrariesToBeInjected != null; // 2. Inject libraries: - if (!created) + //if (!created) // This is an instance that did not load the libs: - instance.injectNatives(); + instance.injectNatives(); + } + + /** + * + * @return + */ + private static LinkedHashSet<Object> getNativeLibraries(ClassLoader cl) { + Vector<Object> curVector = U.field(cl, "nativeLibraries"); + + return new LinkedHashSet<>(curVector); } /** @@ -251,7 +274,7 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache { private Collection<Object> collectNativeLibraries() { List<Object> target = new ArrayList<>(); - ClassLoader ldr = this; + ClassLoader ldr = APP_CLS_LDR; while (ldr != null) { collectNativeLibrariesFromLoader(ldr, target); @@ -267,17 +290,17 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache { */ private void runLoadingCode(String[] libs) { try { - // TODO: "XXX" is a special class loaded by Hadoop class loader (simulating Hadoop class). - // NB: this sample class must *not* cause loading of any natives. - Class<?> sampleCls = this.loadClass(XXX.class.getName(), true); - - assert sampleCls != null; - assert sampleCls.getClassLoader() == this; +// // TODO: "XXX" is a special class loaded by Hadoop class loader (simulating Hadoop class). +// // NB: this sample class must *not* cause loading of any natives. +// Class<?> sampleCls = this.loadClass(XXX.class.getName(), true); +// +// assert sampleCls != null; +// assert sampleCls.getClassLoader() == this; Collection<String> loadedLibs = new ArrayList<>(); for (String lib: libs) { - boolean ok = LoadHelper.tryLoad(sampleCls, lib); + boolean ok = LoadHelper.tryLoad(null, lib); if (ok) loadedLibs.add(lib); http://git-wip-us.apache.org/repos/asf/ignite/blob/83ff85f3/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/LoadHelper.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/LoadHelper.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/LoadHelper.java index a795085..223855b 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/LoadHelper.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/LoadHelper.java @@ -7,18 +7,18 @@ import java.lang.reflect.Method; */ public class LoadHelper { - private static Method method; - - static { - try { - method = ClassLoader.class.getDeclaredMethod("loadLibrary", - new Class[] {Class.class, String.class, boolean.class}); - - method.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } +// private static Method method; +// +// static { +// try { +// method = ClassLoader.class.getDeclaredMethod("loadLibrary", +// new Class[] {Class.class, String.class, boolean.class}); +// +// method.setAccessible(true); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } /** * Utility method that loads given class by name with the given "caller" class. @@ -27,7 +27,7 @@ public class LoadHelper { */ public static boolean tryLoad(Class caller, String libName) { try { - method.invoke(null, new Object[] {caller/*caller class*/, libName /*lib*/ , false/*isAbsolute*/ }); + System.loadLibrary(libName); return true; } @@ -39,4 +39,9 @@ public class LoadHelper { } } + + public static void main(String[] args) { + System.load("/home/ivan/hadoop-2.6.0/lib/native/libhadoop.so"); + } + }