Repository: ignite Updated Branches: refs/heads/ignite-1.5.2 c786820dd -> 6ab4ce246
IGNITE-2342: Set correct classlader before calling FileSystem.get(). Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6ab4ce24 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6ab4ce24 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6ab4ce24 Branch: refs/heads/ignite-1.5.2 Commit: 6ab4ce246316442fa4295f9941c372fea70c24ef Parents: c786820 Author: vozerov-gridgain <[email protected]> Authored: Fri Jan 8 10:23:55 2016 +0400 Committer: vozerov-gridgain <[email protected]> Committed: Fri Jan 8 10:23:55 2016 +0400 ---------------------------------------------------------------------- .../hadoop/fs/BasicHadoopFileSystemFactory.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6ab4ce24/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/BasicHadoopFileSystemFactory.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/BasicHadoopFileSystemFactory.java b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/BasicHadoopFileSystemFactory.java index 1e2bbf2..c791e9a 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/BasicHadoopFileSystemFactory.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/BasicHadoopFileSystemFactory.java @@ -80,7 +80,24 @@ public class BasicHadoopFileSystemFactory implements HadoopFileSystemFactory, Ex assert cfg != null; try { - return FileSystem.get(fullUri, cfg, usrName); + // FileSystem.get() might delegate to ServiceLoader to get the list of file system implementation. + // And ServiceLoader is known to be sensitive to context classloader. Therefore, we change context + // classloader to classloader of current class to avoid strange class-cast-exceptions. + ClassLoader ctxClsLdr = Thread.currentThread().getContextClassLoader(); + ClassLoader clsLdr = getClass().getClassLoader(); + + if (ctxClsLdr == clsLdr) + return FileSystem.get(fullUri, cfg, usrName); + else { + Thread.currentThread().setContextClassLoader(clsLdr); + + try { + return FileSystem.get(fullUri, cfg, usrName); + } + finally { + Thread.currentThread().setContextClassLoader(ctxClsLdr); + } + } } catch (InterruptedException e) { Thread.currentThread().interrupt();
