From d286032b715192ddbdd770b07d623fdc396810e2 Mon Sep 17 00:00:00 2001 From: Colin Patrick Mccabe Date: Tue, 13 Oct 2015 13:11:33 -0700 Subject: [PATCH] HDFS-9187. Fix null pointer error in Globber when FS was not constructed via FileSystem#createFileSystem (cmccabe) --- .../java/org/apache/hadoop/fs/FileSystem.java | 7 ------- .../java/org/apache/hadoop/fs/Globber.java | 2 +- .../apache/hadoop/tracing/TestTraceUtils.java | 18 ++++++++++++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java index 6f13a87650f..bd8aa2a3a89 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java @@ -129,12 +129,6 @@ public abstract class FileSystem extends Configured implements Closeable { boolean resolveSymlinks; - private Tracer tracer; - - protected final Tracer getTracer() { - return tracer; - } - /** * This method adds a file system for testing so that we can find it later. It * is only for testing. @@ -2712,7 +2706,6 @@ private static FileSystem createFileSystem(URI uri, Configuration conf try { Class clazz = getFileSystemClass(uri.getScheme(), conf); FileSystem fs = (FileSystem)ReflectionUtils.newInstance(clazz, conf); - fs.tracer = tracer; fs.initialize(uri, conf); return fs; } finally { diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Globber.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Globber.java index 7a015751ceb..7c69167c3a1 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Globber.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Globber.java @@ -47,7 +47,7 @@ public Globber(FileSystem fs, Path pathPattern, PathFilter filter) { this.fc = null; this.pathPattern = pathPattern; this.filter = filter; - this.tracer = fs.getTracer(); + this.tracer = FsTracer.get(fs.getConf()); } public Globber(FileContext fc, Path pathPattern, PathFilter filter) { diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/TestTraceUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/TestTraceUtils.java index 75411dacce5..fc0726e3eef 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/TestTraceUtils.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/TestTraceUtils.java @@ -18,8 +18,13 @@ package org.apache.hadoop.tracing; import static org.junit.Assert.assertEquals; + +import java.net.URI; import java.util.LinkedList; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.LocalFileSystem; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.tracing.SpanReceiverInfo.ConfigurationPair; import org.apache.htrace.core.HTraceConfiguration; import org.junit.Test; @@ -50,4 +55,17 @@ public void testExtraConfig() { HTraceConfiguration wrapped = TraceUtils.wrapHadoopConf(TEST_PREFIX, conf, extraConfig); assertEquals(newValue, wrapped.get(key)); } + + /** + * Test tracing the globber. This is a regression test for HDFS-9187. + */ + @Test + public void testTracingGlobber() throws Exception { + // Bypass the normal FileSystem object creation path by just creating an + // instance of a subclass. + FileSystem fs = new LocalFileSystem(); + fs.initialize(new URI("file:///"), new Configuration()); + fs.globStatus(new Path("/")); + fs.close(); + } }