Return-Path: X-Original-To: apmail-hadoop-common-commits-archive@www.apache.org Delivered-To: apmail-hadoop-common-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 541EA18624 for ; Wed, 30 Sep 2015 15:41:13 +0000 (UTC) Received: (qmail 87251 invoked by uid 500); 30 Sep 2015 15:41:02 -0000 Delivered-To: apmail-hadoop-common-commits-archive@hadoop.apache.org Received: (qmail 87069 invoked by uid 500); 30 Sep 2015 15:41:02 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: common-dev@hadoop.apache.org Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 85533 invoked by uid 99); 30 Sep 2015 15:41:01 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 30 Sep 2015 15:41:01 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id A5F97DF99B; Wed, 30 Sep 2015 15:41:01 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: zhz@apache.org To: common-commits@hadoop.apache.org Date: Wed, 30 Sep 2015 15:41:20 -0000 Message-Id: <647caa89d6d44f7184330e869c3d73d8@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [20/58] [abbrv] hadoop git commit: HDFS-9080. Update htrace version to 4.0.1 (cmccabe) HDFS-9080. Update htrace version to 4.0.1 (cmccabe) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/892ade68 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/892ade68 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/892ade68 Branch: refs/heads/HDFS-7285 Commit: 892ade689f9bcce76daae8f66fc00a49bee8548e Parents: 66dad85 Author: Colin Patrick Mccabe Authored: Sat Sep 26 22:05:51 2015 -0700 Committer: Colin Patrick Mccabe Committed: Mon Sep 28 07:42:12 2015 -0700 ---------------------------------------------------------------------- hadoop-common-project/hadoop-common/pom.xml | 2 +- .../hadoop/fs/CommonConfigurationKeys.java | 3 + .../org/apache/hadoop/fs/FSOutputSummer.java | 12 +- .../java/org/apache/hadoop/fs/FileContext.java | 7 + .../java/org/apache/hadoop/fs/FileSystem.java | 21 +- .../main/java/org/apache/hadoop/fs/FsShell.java | 25 +-- .../java/org/apache/hadoop/fs/FsTracer.java | 64 ++++++ .../main/java/org/apache/hadoop/fs/Globber.java | 15 +- .../main/java/org/apache/hadoop/ipc/Client.java | 13 +- .../apache/hadoop/ipc/ProtobufRpcEngine.java | 17 +- .../main/java/org/apache/hadoop/ipc/Server.java | 51 +++-- .../apache/hadoop/ipc/WritableRpcEngine.java | 13 +- .../apache/hadoop/tracing/SpanReceiverHost.java | 208 ------------------- .../org/apache/hadoop/tracing/TraceUtils.java | 24 ++- .../tracing/TracerConfigurationManager.java | 100 +++++++++ .../java/org/apache/hadoop/util/ProtoUtil.java | 13 +- .../src/main/proto/RpcHeader.proto | 5 +- .../src/main/resources/core-default.xml | 15 ++ .../hadoop-common/src/site/markdown/Tracing.md | 80 +++---- .../java/org/apache/hadoop/fs/TestFsShell.java | 11 +- .../apache/hadoop/tracing/SetSpanReceiver.java | 13 +- .../apache/hadoop/tracing/TestTraceUtils.java | 2 +- .../apache/hadoop/hdfs/BlockReaderFactory.java | 18 +- .../apache/hadoop/hdfs/BlockReaderLocal.java | 21 +- .../hadoop/hdfs/BlockReaderLocalLegacy.java | 30 +-- .../java/org/apache/hadoop/hdfs/DFSClient.java | 201 +++++++++--------- .../hadoop/hdfs/DFSInotifyEventInputStream.java | 29 ++- .../org/apache/hadoop/hdfs/DFSInputStream.java | 22 +- .../org/apache/hadoop/hdfs/DFSOutputStream.java | 21 +- .../java/org/apache/hadoop/hdfs/DFSPacket.java | 31 +-- .../org/apache/hadoop/hdfs/DataStreamer.java | 71 ++++--- .../apache/hadoop/hdfs/RemoteBlockReader.java | 20 +- .../apache/hadoop/hdfs/RemoteBlockReader2.java | 23 +- .../hdfs/protocol/CacheDirectiveIterator.java | 13 +- .../hadoop/hdfs/protocol/CachePoolIterator.java | 13 +- .../hdfs/protocol/EncryptionZoneIterator.java | 14 +- .../datatransfer/DataTransferProtoUtil.java | 42 +--- .../hdfs/protocol/datatransfer/Sender.java | 22 +- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 + hadoop-hdfs-project/hadoop-hdfs/pom.xml | 2 +- .../org/apache/hadoop/hdfs/DFSConfigKeys.java | 8 +- .../hdfs/protocol/datatransfer/Receiver.java | 35 +++- .../hdfs/qjournal/server/JournalNode.java | 13 +- .../qjournal/server/JournalNodeRpcServer.java | 1 + .../hdfs/server/datanode/BlockSender.java | 9 +- .../hadoop/hdfs/server/datanode/DataNode.java | 35 +++- .../hdfs/server/datanode/DataXceiver.java | 2 +- .../hadoop/hdfs/server/namenode/NameNode.java | 25 ++- .../hdfs/server/namenode/NameNodeRpcServer.java | 10 +- .../hdfs/server/namenode/NamenodeFsck.java | 5 + .../src/main/resources/hdfs-default.xml | 13 +- .../apache/hadoop/hdfs/BlockReaderTestUtil.java | 2 + .../hadoop/hdfs/TestBlockReaderLocal.java | 2 + .../apache/hadoop/hdfs/TestDFSOutputStream.java | 5 +- .../org/apache/hadoop/hdfs/TestDFSPacket.java | 25 +-- .../server/namenode/TestCacheDirectives.java | 4 +- .../hadoop/hdfs/server/namenode/TestFsck.java | 3 +- .../hadoop/tools/TestHdfsConfigFields.java | 6 +- .../apache/hadoop/tracing/TestTraceAdmin.java | 9 +- .../org/apache/hadoop/tracing/TestTracing.java | 84 +++++--- .../TestTracingShortCircuitLocalRead.java | 18 +- hadoop-project/pom.xml | 4 +- 62 files changed, 857 insertions(+), 770 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/pom.xml ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/pom.xml b/hadoop-common-project/hadoop-common/pom.xml index ef77dbd..21af670 100644 --- a/hadoop-common-project/hadoop-common/pom.xml +++ b/hadoop-common-project/hadoop-common/pom.xml @@ -246,7 +246,7 @@ org.apache.htrace - htrace-core + htrace-core4 org.apache.zookeeper http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java index 2721466..09d2550 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java @@ -295,4 +295,7 @@ public class CommonConfigurationKeys extends CommonConfigurationKeysPublic { public static final String NFS_EXPORTS_ALLOWED_HOSTS_SEPARATOR = ";"; public static final String NFS_EXPORTS_ALLOWED_HOSTS_KEY = "nfs.exports.allowed.hosts"; public static final String NFS_EXPORTS_ALLOWED_HOSTS_KEY_DEFAULT = "* rw"; + + // HDFS client HTrace configuration. + public static final String FS_CLIENT_HTRACE_PREFIX = "fs.client.htrace."; } http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java index bdc5585..648043e 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java @@ -21,8 +21,8 @@ package org.apache.hadoop.fs; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.util.DataChecksum; -import org.apache.htrace.NullScope; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; import java.io.IOException; import java.io.OutputStream; @@ -43,6 +43,8 @@ abstract public class FSOutputSummer extends OutputStream { private byte checksum[]; // The number of valid bytes in the buffer. private int count; + // The HTrace tracer to use + private Tracer tracer; // We want this value to be a multiple of 3 because the native code checksums // 3 chunks simultaneously. The chosen value of 9 strikes a balance between @@ -197,7 +199,7 @@ abstract public class FSOutputSummer extends OutputStream { } protected TraceScope createWriteTraceScope() { - return NullScope.INSTANCE; + return null; } /** Generate checksums for the given data chunks and output chunks & checksums @@ -215,7 +217,9 @@ abstract public class FSOutputSummer extends OutputStream { getChecksumSize()); } } finally { - scope.close(); + if (scope != null) { + scope.close(); + } } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileContext.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileContext.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileContext.java index a98d662..4dbf9e3 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileContext.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileContext.java @@ -61,6 +61,7 @@ import org.apache.hadoop.security.token.Token; import org.apache.hadoop.util.ShutdownHookManager; import com.google.common.base.Preconditions; +import org.apache.htrace.core.Tracer; /** * The FileContext class provides an interface for users of the Hadoop @@ -222,12 +223,14 @@ public class FileContext { private final Configuration conf; private final UserGroupInformation ugi; final boolean resolveSymlinks; + private final Tracer tracer; private FileContext(final AbstractFileSystem defFs, final FsPermission theUmask, final Configuration aConf) { defaultFS = defFs; umask = FsPermission.getUMask(aConf); conf = aConf; + tracer = FsTracer.get(aConf); try { ugi = UserGroupInformation.getCurrentUser(); } catch (IOException e) { @@ -2721,4 +2724,8 @@ public class FileContext { throws IOException { return defaultFS.getAllStoragePolicies(); } + + Tracer getTracer() { + return tracer; + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java ---------------------------------------------------------------------- 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 8f32644..2bcaa54 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 @@ -67,9 +67,8 @@ import org.apache.hadoop.util.Progressable; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.ShutdownHookManager; import org.apache.hadoop.util.StringUtils; -import org.apache.htrace.Span; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.Tracer; +import org.apache.htrace.core.TraceScope; import com.google.common.annotations.VisibleForTesting; @@ -129,6 +128,13 @@ public abstract class FileSystem extends Configured implements Closeable { private Set deleteOnExit = new TreeSet(); 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. @@ -2706,14 +2712,13 @@ public abstract class FileSystem extends Configured implements Closeable { private static FileSystem createFileSystem(URI uri, Configuration conf ) throws IOException { - TraceScope scope = Trace.startSpan("FileSystem#createFileSystem"); - Span span = scope.getSpan(); - if (span != null) { - span.addKVAnnotation("scheme", uri.getScheme()); - } + Tracer tracer = FsTracer.get(conf); + TraceScope scope = tracer.newScope("FileSystem#createFileSystem"); + scope.addKVAnnotation("scheme", uri.getScheme()); try { Class clazz = getFileSystemClass(uri.getScheme(), conf); FileSystem fs = (FileSystem)ReflectionUtils.newInstance(clazz, conf); + fs.tracer = tracer; fs.initialize(uri, conf); return fs; } finally { http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java index 35608e2..d91866e 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java @@ -32,16 +32,13 @@ import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.shell.Command; import org.apache.hadoop.fs.shell.CommandFactory; import org.apache.hadoop.fs.shell.FsCommand; -import org.apache.hadoop.tracing.SpanReceiverHost; import org.apache.hadoop.tools.TableListing; import org.apache.hadoop.tracing.TraceUtils; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; -import org.apache.htrace.Sampler; -import org.apache.htrace.SamplerBuilder; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; /** Provide command line access to a FileSystem. */ @InterfaceAudience.Private @@ -54,13 +51,12 @@ public class FsShell extends Configured implements Tool { private FileSystem fs; private Trash trash; protected CommandFactory commandFactory; - private Sampler traceSampler; private final String usagePrefix = "Usage: hadoop fs [generic options]"; - private SpanReceiverHost spanReceiverHost; - static final String SEHLL_HTRACE_PREFIX = "dfs.shell.htrace."; + private Tracer tracer; + static final String SHELL_HTRACE_PREFIX = "fs.shell.htrace."; /** * Default ctor with no configuration. Be sure to invoke @@ -102,8 +98,9 @@ public class FsShell extends Configured implements Tool { commandFactory.addObject(new Usage(), "-usage"); registerCommands(commandFactory); } - this.spanReceiverHost = - SpanReceiverHost.get(getConf(), SEHLL_HTRACE_PREFIX); + this.tracer = new Tracer.Builder("FsShell"). + conf(TraceUtils.wrapHadoopConf(SHELL_HTRACE_PREFIX, getConf())). + build(); } protected void registerCommands(CommandFactory factory) { @@ -285,8 +282,6 @@ public class FsShell extends Configured implements Tool { public int run(String argv[]) throws Exception { // initialize FsShell init(); - traceSampler = new SamplerBuilder(TraceUtils. - wrapHadoopConf(SEHLL_HTRACE_PREFIX, getConf())).build(); int exitCode = -1; if (argv.length < 1) { printUsage(System.err); @@ -298,7 +293,7 @@ public class FsShell extends Configured implements Tool { if (instance == null) { throw new UnknownCommandException(); } - TraceScope scope = Trace.startSpan(instance.getCommandName(), traceSampler); + TraceScope scope = tracer.newScope(instance.getCommandName()); if (scope.getSpan() != null) { String args = StringUtils.join(" ", argv); if (args.length() > 2048) { @@ -324,6 +319,7 @@ public class FsShell extends Configured implements Tool { e.printStackTrace(System.err); } } + tracer.close(); return exitCode; } @@ -350,9 +346,6 @@ public class FsShell extends Configured implements Tool { fs.close(); fs = null; } - if (this.spanReceiverHost != null) { - this.spanReceiverHost.closeReceivers(); - } } /** http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsTracer.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsTracer.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsTracer.java new file mode 100644 index 0000000..e422336 --- /dev/null +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsTracer.java @@ -0,0 +1,64 @@ +/** + * 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.hadoop.fs; + +import com.google.common.annotations.VisibleForTesting; +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.tracing.TraceUtils; +import org.apache.htrace.core.Tracer; + +/** + * Holds the HTrace Tracer used for FileSystem operations. + * + * Ideally, this would be owned by the DFSClient, rather than global. However, + * the FileContext API may create a new DFSClient for each operation in some + * cases. Because of this, we cannot store this Tracer inside DFSClient. See + * HADOOP-6356 for details. + */ +@InterfaceAudience.Private +@InterfaceStability.Unstable +public final class FsTracer { + private static Tracer instance; + + public static synchronized Tracer get(Configuration conf) { + if (instance == null) { + instance = new Tracer.Builder("FSClient"). + conf(TraceUtils.wrapHadoopConf(CommonConfigurationKeys. + FS_CLIENT_HTRACE_PREFIX, conf)). + build(); + } + return instance; + } + + @VisibleForTesting + public static synchronized void clear() { + if (instance == null) { + return; + } + try { + instance.close(); + } finally { + instance = null; + } + } + + private FsTracer() { + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Globber.java ---------------------------------------------------------------------- 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 48639b4..7a01575 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 @@ -28,9 +28,8 @@ import org.apache.commons.logging.Log; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; -import org.apache.htrace.Span; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; @InterfaceAudience.Private @InterfaceStability.Unstable @@ -41,12 +40,14 @@ class Globber { private final FileContext fc; private final Path pathPattern; private final PathFilter filter; + private final Tracer tracer; public Globber(FileSystem fs, Path pathPattern, PathFilter filter) { this.fs = fs; this.fc = null; this.pathPattern = pathPattern; this.filter = filter; + this.tracer = fs.getTracer(); } public Globber(FileContext fc, Path pathPattern, PathFilter filter) { @@ -54,6 +55,7 @@ class Globber { this.fc = fc; this.pathPattern = pathPattern; this.filter = filter; + this.tracer = fc.getTracer(); } private FileStatus getFileStatus(Path path) throws IOException { @@ -140,11 +142,8 @@ class Globber { } public FileStatus[] glob() throws IOException { - TraceScope scope = Trace.startSpan("Globber#glob"); - Span span = scope.getSpan(); - if (span != null) { - span.addKVAnnotation("pattern", pathPattern.toUri().getPath()); - } + TraceScope scope = tracer.newScope("Globber#glob"); + scope.addKVAnnotation("pattern", pathPattern.toUri().getPath()); try { return doGlob(); } finally { http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java index 9087e5c..bfa85aa 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java @@ -92,7 +92,8 @@ import org.apache.hadoop.util.ProtoUtil; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.Time; -import org.apache.htrace.Trace; +import org.apache.htrace.core.Span; +import org.apache.htrace.core.Tracer; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -722,8 +723,9 @@ public class Client { if (LOG.isDebugEnabled()) { LOG.debug("Connecting to "+server); } - if (Trace.isTracing()) { - Trace.addTimelineAnnotation("IPC client connecting to " + server); + Span span = Tracer.getCurrentSpan(); + if (span != null) { + span.addTimelineAnnotation("IPC client connecting to " + server); } short numRetries = 0; Random rand = null; @@ -796,8 +798,9 @@ public class Client { // update last activity time touch(); - if (Trace.isTracing()) { - Trace.addTimelineAnnotation("IPC client connected to " + server); + span = Tracer.getCurrentSpan(); + if (span != null) { + span.addTimelineAnnotation("IPC client connected to " + server); } // start the receiver thread after the socket connection has been set http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ProtobufRpcEngine.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ProtobufRpcEngine.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ProtobufRpcEngine.java index 532246d..692d2b6 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ProtobufRpcEngine.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ProtobufRpcEngine.java @@ -49,8 +49,8 @@ import org.apache.hadoop.security.token.SecretManager; import org.apache.hadoop.security.token.TokenIdentifier; import org.apache.hadoop.util.ProtoUtil; import org.apache.hadoop.util.Time; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; import com.google.common.annotations.VisibleForTesting; import com.google.protobuf.BlockingService; @@ -206,12 +206,13 @@ public class ProtobufRpcEngine implements RpcEngine { + method.getName() + "]"); } - TraceScope traceScope = null; // if Tracing is on then start a new span for this rpc. // guard it in the if statement to make sure there isn't // any extra string manipulation. - if (Trace.isTracing()) { - traceScope = Trace.startSpan(RpcClientUtil.methodToTraceString(method)); + Tracer tracer = Tracer.curThreadTracer(); + TraceScope traceScope = null; + if (tracer != null) { + traceScope = tracer.newScope(RpcClientUtil.methodToTraceString(method)); } RequestHeaderProto rpcRequestHeader = constructRpcRequestHeader(method); @@ -236,9 +237,9 @@ public class ProtobufRpcEngine implements RpcEngine { remoteId + ": " + method.getName() + " {" + e + "}"); } - if (Trace.isTracing()) { - traceScope.getSpan().addTimelineAnnotation( - "Call got exception: " + e.toString()); + if (traceScope != null) { + traceScope.addTimelineAnnotation("Call got exception: " + + e.toString()); } throw new ServiceException(e); } finally { http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Server.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Server.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Server.java index 0f9ae43..b8026c6 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Server.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Server.java @@ -117,10 +117,9 @@ import org.apache.hadoop.util.ProtoUtil; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.Time; -import org.apache.htrace.Span; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceInfo; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.SpanId; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; import com.google.common.annotations.VisibleForTesting; import com.google.protobuf.ByteString; @@ -141,6 +140,7 @@ public abstract class Server { private List enabledAuthMethods; private RpcSaslProto negotiateResponse; private ExceptionsHandler exceptionsHandler = new ExceptionsHandler(); + private Tracer tracer; public void addTerseExceptions(Class... exceptionClass) { exceptionsHandler.addTerseExceptions(exceptionClass); @@ -581,7 +581,7 @@ public abstract class Server { private ByteBuffer rpcResponse; // the response for this call private final RPC.RpcKind rpcKind; private final byte[] clientId; - private final Span traceSpan; // the tracing span on the server side + private final TraceScope traceScope; // the HTrace scope on the server side public Call(int id, int retryCount, Writable param, Connection connection) { @@ -595,7 +595,7 @@ public abstract class Server { } public Call(int id, int retryCount, Writable param, Connection connection, - RPC.RpcKind kind, byte[] clientId, Span span) { + RPC.RpcKind kind, byte[] clientId, TraceScope traceScope) { this.callId = id; this.retryCount = retryCount; this.rpcRequest = param; @@ -604,7 +604,7 @@ public abstract class Server { this.rpcResponse = null; this.rpcKind = kind; this.clientId = clientId; - this.traceSpan = span; + this.traceScope = traceScope; } @Override @@ -2014,19 +2014,24 @@ public abstract class Server { RpcErrorCodeProto.FATAL_DESERIALIZING_REQUEST, err); } - Span traceSpan = null; + TraceScope traceScope = null; if (header.hasTraceInfo()) { - // If the incoming RPC included tracing info, always continue the trace - TraceInfo parentSpan = new TraceInfo(header.getTraceInfo().getTraceId(), - header.getTraceInfo().getParentId()); - traceSpan = Trace.startSpan( - RpcClientUtil.toTraceName(rpcRequest.toString()), - parentSpan).detach(); + if (tracer != null) { + // If the incoming RPC included tracing info, always continue the + // trace + SpanId parentSpanId = new SpanId( + header.getTraceInfo().getTraceId(), + header.getTraceInfo().getParentId()); + traceScope = tracer.newScope( + RpcClientUtil.toTraceName(rpcRequest.toString()), + parentSpanId); + traceScope.detach(); + } } Call call = new Call(header.getCallId(), header.getRetryCount(), rpcRequest, this, ProtoUtil.convert(header.getRpcKind()), - header.getClientId().toByteArray(), traceSpan); + header.getClientId().toByteArray(), traceScope); if (callQueue.isClientBackoffEnabled()) { // if RPC queue is full, we will ask the RPC client to back off by @@ -2209,8 +2214,9 @@ public abstract class Server { Writable value = null; CurCall.set(call); - if (call.traceSpan != null) { - traceScope = Trace.continueSpan(call.traceSpan); + if (call.traceScope != null) { + call.traceScope.reattach(); + traceScope = call.traceScope; traceScope.getSpan().addTimelineAnnotation("called"); } @@ -2287,21 +2293,18 @@ public abstract class Server { } catch (InterruptedException e) { if (running) { // unexpected -- log it LOG.info(Thread.currentThread().getName() + " unexpectedly interrupted", e); - if (Trace.isTracing()) { + if (traceScope != null) { traceScope.getSpan().addTimelineAnnotation("unexpectedly interrupted: " + StringUtils.stringifyException(e)); } } } catch (Exception e) { LOG.info(Thread.currentThread().getName() + " caught an exception", e); - if (Trace.isTracing()) { + if (traceScope != null) { traceScope.getSpan().addTimelineAnnotation("Exception: " + StringUtils.stringifyException(e)); } } finally { - if (traceScope != null) { - traceScope.close(); - } IOUtils.cleanup(LOG, traceScope); } } @@ -2615,6 +2618,10 @@ public abstract class Server { /** Sets the socket buffer size used for responding to RPCs */ public void setSocketSendBufSize(int size) { this.socketSendBufferSize = size; } + public void setTracer(Tracer t) { + this.tracer = t; + } + /** Starts the service. Must be called before any calls will be handled. */ public synchronized void start() { responder.start(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/WritableRpcEngine.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/WritableRpcEngine.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/WritableRpcEngine.java index 85490f3..46f33ba 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/WritableRpcEngine.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/WritableRpcEngine.java @@ -42,8 +42,8 @@ import org.apache.hadoop.util.Time; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.*; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; /** An RpcEngine implementation for Writable data. */ @InterfaceStability.Evolving @@ -233,9 +233,14 @@ public class WritableRpcEngine implements RpcEngine { if (LOG.isDebugEnabled()) { startTime = Time.now(); } + + // if Tracing is on then start a new span for this rpc. + // guard it in the if statement to make sure there isn't + // any extra string manipulation. + Tracer tracer = Tracer.curThreadTracer(); TraceScope traceScope = null; - if (Trace.isTracing()) { - traceScope = Trace.startSpan(RpcClientUtil.methodToTraceString(method)); + if (tracer != null) { + traceScope = tracer.newScope(RpcClientUtil.methodToTraceString(method)); } ObjectWritable value; try { http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/SpanReceiverHost.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/SpanReceiverHost.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/SpanReceiverHost.java deleted file mode 100644 index 9a99e05..0000000 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/SpanReceiverHost.java +++ /dev/null @@ -1,208 +0,0 @@ -/** - * 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.hadoop.tracing; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.classification.InterfaceAudience; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.tracing.SpanReceiverInfo.ConfigurationPair; -import org.apache.hadoop.util.ShutdownHookManager; -import org.apache.htrace.SpanReceiver; -import org.apache.htrace.SpanReceiverBuilder; -import org.apache.htrace.Trace; -import org.apache.htrace.impl.LocalFileSpanReceiver; - -/** - * This class provides functions for reading the names of SpanReceivers from - * the Hadoop configuration, adding those SpanReceivers to the Tracer, - * and closing those SpanReceivers when appropriate. - * This class does nothing If no SpanReceiver is configured. - */ -@InterfaceAudience.Private -public class SpanReceiverHost implements TraceAdminProtocol { - public static final String SPAN_RECEIVERS_CONF_SUFFIX = - "spanreceiver.classes"; - private static final Log LOG = LogFactory.getLog(SpanReceiverHost.class); - private static final HashMap hosts = - new HashMap(1); - private final TreeMap receivers = - new TreeMap(); - private final String confPrefix; - private Configuration config; - private boolean closed = false; - private long highestId = 1; - - private final static String LOCAL_FILE_SPAN_RECEIVER_PATH_SUFFIX = - "local-file-span-receiver.path"; - - public static SpanReceiverHost get(Configuration conf, String confPrefix) { - synchronized (SpanReceiverHost.class) { - SpanReceiverHost host = hosts.get(confPrefix); - if (host != null) { - return host; - } - final SpanReceiverHost newHost = new SpanReceiverHost(confPrefix); - newHost.loadSpanReceivers(conf); - ShutdownHookManager.get().addShutdownHook(new Runnable() { - public void run() { - newHost.closeReceivers(); - } - }, 0); - hosts.put(confPrefix, newHost); - return newHost; - } - } - - private static List EMPTY = Collections.emptyList(); - - private SpanReceiverHost(String confPrefix) { - this.confPrefix = confPrefix; - } - - /** - * Reads the names of classes specified in the - * "hadoop.htrace.spanreceiver.classes" property and instantiates and registers - * them with the Tracer as SpanReceiver's. - * - * The nullary constructor is called during construction, but if the classes - * specified implement the Configurable interface, setConfiguration() will be - * called on them. This allows SpanReceivers to use values from the Hadoop - * configuration. - */ - public synchronized void loadSpanReceivers(Configuration conf) { - config = new Configuration(conf); - String receiverKey = confPrefix + SPAN_RECEIVERS_CONF_SUFFIX; - String[] receiverNames = config.getTrimmedStrings(receiverKey); - if (receiverNames == null || receiverNames.length == 0) { - if (LOG.isTraceEnabled()) { - LOG.trace("No span receiver names found in " + receiverKey + "."); - } - return; - } - // It's convenient to have each daemon log to a random trace file when - // testing. - String pathKey = confPrefix + LOCAL_FILE_SPAN_RECEIVER_PATH_SUFFIX; - if (config.get(pathKey) == null) { - String uniqueFile = LocalFileSpanReceiver.getUniqueLocalTraceFileName(); - config.set(pathKey, uniqueFile); - if (LOG.isTraceEnabled()) { - LOG.trace("Set " + pathKey + " to " + uniqueFile); - } - } - for (String className : receiverNames) { - try { - SpanReceiver rcvr = loadInstance(className, EMPTY); - Trace.addReceiver(rcvr); - receivers.put(highestId++, rcvr); - LOG.info("Loaded SpanReceiver " + className + " successfully."); - } catch (IOException e) { - LOG.error("Failed to load SpanReceiver", e); - } - } - } - - private synchronized SpanReceiver loadInstance(String className, - List extraConfig) throws IOException { - SpanReceiverBuilder builder = - new SpanReceiverBuilder(TraceUtils. - wrapHadoopConf(confPrefix, config, extraConfig)); - SpanReceiver rcvr = builder.spanReceiverClass(className.trim()).build(); - if (rcvr == null) { - throw new IOException("Failed to load SpanReceiver " + className); - } - return rcvr; - } - - /** - * Calls close() on all SpanReceivers created by this SpanReceiverHost. - */ - public synchronized void closeReceivers() { - if (closed) return; - closed = true; - for (SpanReceiver rcvr : receivers.values()) { - try { - rcvr.close(); - } catch (IOException e) { - LOG.warn("Unable to close SpanReceiver correctly: " + e.getMessage(), e); - } - } - receivers.clear(); - } - - public synchronized SpanReceiverInfo[] listSpanReceivers() - throws IOException { - SpanReceiverInfo[] info = new SpanReceiverInfo[receivers.size()]; - int i = 0; - - for(Map.Entry entry : receivers.entrySet()) { - info[i] = new SpanReceiverInfo(entry.getKey(), - entry.getValue().getClass().getName()); - i++; - } - return info; - } - - public synchronized long addSpanReceiver(SpanReceiverInfo info) - throws IOException { - StringBuilder configStringBuilder = new StringBuilder(); - String prefix = ""; - for (ConfigurationPair pair : info.configPairs) { - configStringBuilder.append(prefix).append(pair.getKey()). - append(" = ").append(pair.getValue()); - prefix = ", "; - } - SpanReceiver rcvr = null; - try { - rcvr = loadInstance(info.getClassName(), info.configPairs); - } catch (IOException e) { - LOG.info("Failed to add SpanReceiver " + info.getClassName() + - " with configuration " + configStringBuilder.toString(), e); - throw e; - } catch (RuntimeException e) { - LOG.info("Failed to add SpanReceiver " + info.getClassName() + - " with configuration " + configStringBuilder.toString(), e); - throw e; - } - Trace.addReceiver(rcvr); - long newId = highestId++; - receivers.put(newId, rcvr); - LOG.info("Successfully added SpanReceiver " + info.getClassName() + - " with configuration " + configStringBuilder.toString()); - return newId; - } - - public synchronized void removeSpanReceiver(long spanReceiverId) - throws IOException { - SpanReceiver rcvr = receivers.remove(spanReceiverId); - if (rcvr == null) { - throw new IOException("There is no span receiver with id " + spanReceiverId); - } - Trace.removeReceiver(rcvr); - rcvr.close(); - LOG.info("Successfully removed SpanReceiver " + spanReceiverId + - " with class " + rcvr.getClass().getName()); - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TraceUtils.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TraceUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TraceUtils.java index 52b5d47..09acb35 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TraceUtils.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TraceUtils.java @@ -24,7 +24,7 @@ import java.util.List; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.tracing.SpanReceiverInfo.ConfigurationPair; -import org.apache.htrace.HTraceConfiguration; +import org.apache.htrace.core.HTraceConfiguration; /** * This class provides utility functions for tracing. @@ -32,6 +32,7 @@ import org.apache.htrace.HTraceConfiguration; @InterfaceAudience.Private public class TraceUtils { private static List EMPTY = Collections.emptyList(); + static final String DEFAULT_HADOOP_PREFIX = "hadoop.htrace."; public static HTraceConfiguration wrapHadoopConf(final String prefix, final Configuration conf) { @@ -47,16 +48,27 @@ public class TraceUtils { return new HTraceConfiguration() { @Override public String get(String key) { - return get(key, ""); + String ret = getInternal(prefix + key); + if (ret != null) { + return ret; + } + return getInternal(DEFAULT_HADOOP_PREFIX + key); } @Override public String get(String key, String defaultValue) { - String prefixedKey = prefix + key; - if (extraMap.containsKey(prefixedKey)) { - return extraMap.get(prefixedKey); + String ret = get(key); + if (ret != null) { + return ret; + } + return defaultValue; + } + + private String getInternal(String key) { + if (extraMap.containsKey(key)) { + return extraMap.get(key); } - return conf.get(prefixedKey, defaultValue); + return conf.get(key); } }; } http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TracerConfigurationManager.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TracerConfigurationManager.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TracerConfigurationManager.java new file mode 100644 index 0000000..75601ad --- /dev/null +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/tracing/TracerConfigurationManager.java @@ -0,0 +1,100 @@ +/** + * 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.hadoop.tracing; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.tracing.SpanReceiverInfo.ConfigurationPair; +import org.apache.htrace.core.SpanReceiver; +import org.apache.htrace.core.TracerPool; + +/** + * This class provides functions for managing the tracer configuration at + * runtime via an RPC protocol. + */ +@InterfaceAudience.Private +public class TracerConfigurationManager implements TraceAdminProtocol { + private static final Log LOG = + LogFactory.getLog(TracerConfigurationManager.class); + + private final String confPrefix; + private final Configuration conf; + + public TracerConfigurationManager(String confPrefix, Configuration conf) { + this.confPrefix = confPrefix; + this.conf = conf; + } + + public synchronized SpanReceiverInfo[] listSpanReceivers() + throws IOException { + TracerPool pool = TracerPool.getGlobalTracerPool(); + SpanReceiver[] receivers = pool.getReceivers(); + SpanReceiverInfo[] info = new SpanReceiverInfo[receivers.length]; + for (int i = 0; i < receivers.length; i++) { + SpanReceiver receiver = receivers[i]; + info[i] = new SpanReceiverInfo(receiver.getId(), + receiver.getClass().getName()); + } + return info; + } + + public synchronized long addSpanReceiver(SpanReceiverInfo info) + throws IOException { + StringBuilder configStringBuilder = new StringBuilder(); + String prefix = ""; + for (ConfigurationPair pair : info.configPairs) { + configStringBuilder.append(prefix).append(pair.getKey()). + append(" = ").append(pair.getValue()); + prefix = ", "; + } + SpanReceiver rcvr = null; + try { + rcvr = new SpanReceiver.Builder(TraceUtils.wrapHadoopConf( + confPrefix, conf, info.configPairs)). + className(info.getClassName().trim()). + build(); + } catch (RuntimeException e) { + LOG.info("Failed to add SpanReceiver " + info.getClassName() + + " with configuration " + configStringBuilder.toString(), e); + throw e; + } + TracerPool.getGlobalTracerPool().addReceiver(rcvr); + LOG.info("Successfully added SpanReceiver " + info.getClassName() + + " with configuration " + configStringBuilder.toString()); + return rcvr.getId(); + } + + public synchronized void removeSpanReceiver(long spanReceiverId) + throws IOException { + SpanReceiver[] receivers = + TracerPool.getGlobalTracerPool().getReceivers(); + for (SpanReceiver receiver : receivers) { + if (receiver.getId() == spanReceiverId) { + TracerPool.getGlobalTracerPool().removeAndCloseReceiver(receiver); + LOG.info("Successfully removed SpanReceiver " + spanReceiverId + + " with class " + receiver.getClass().getName()); + return; + } + } + throw new IOException("There is no span receiver with id " + spanReceiverId); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ProtoUtil.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ProtoUtil.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ProtoUtil.java index 4b3b7ef..3a6bf90 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ProtoUtil.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ProtoUtil.java @@ -27,8 +27,8 @@ import org.apache.hadoop.ipc.protobuf.IpcConnectionContextProtos.UserInformation import org.apache.hadoop.ipc.protobuf.RpcHeaderProtos.*; import org.apache.hadoop.security.SaslRpcServer.AuthMethod; import org.apache.hadoop.security.UserGroupInformation; -import org.apache.htrace.Span; -import org.apache.htrace.Trace; +import org.apache.htrace.core.Span; +import org.apache.htrace.core.Tracer; import com.google.protobuf.ByteString; @@ -169,11 +169,12 @@ public abstract class ProtoUtil { .setRetryCount(retryCount).setClientId(ByteString.copyFrom(uuid)); // Add tracing info if we are currently tracing. - if (Trace.isTracing()) { - Span s = Trace.currentSpan(); + Span span = Tracer.getCurrentSpan(); + if (span != null) { result.setTraceInfo(RPCTraceInfoProto.newBuilder() - .setParentId(s.getSpanId()) - .setTraceId(s.getTraceId()).build()); + .setTraceId(span.getSpanId().getHigh()) + .setParentId(span.getSpanId().getLow()) + .build()); } return result.build(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/proto/RpcHeader.proto ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/proto/RpcHeader.proto b/hadoop-common-project/hadoop-common/src/main/proto/RpcHeader.proto index c879150..7546c62 100644 --- a/hadoop-common-project/hadoop-common/src/main/proto/RpcHeader.proto +++ b/hadoop-common-project/hadoop-common/src/main/proto/RpcHeader.proto @@ -61,8 +61,9 @@ enum RpcKindProto { * what span caused the new span we will create when this message is received. */ message RPCTraceInfoProto { - optional int64 traceId = 1; - optional int64 parentId = 2; + optional int64 traceId = 1; // parentIdHigh + optional int64 parentId = 2; // parentIdLow + } message RpcRequestHeaderProto { // the header for the RpcRequest http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml index a57e81b..9af86e0 100644 --- a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml +++ b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml @@ -1998,4 +1998,19 @@ for ldap providers in the same way as above does. the limit is 0 or the -safely is not specified in -rm command. + + + fs.client.htrace.sampler.classes + + The class names of the HTrace Samplers to use for Hadoop + filesystem clients. + + + + + hadoop.htrace.span.receiver.classes + + The class names of the Span Receivers to use for Hadoop. + + http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/site/markdown/Tracing.md ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/site/markdown/Tracing.md b/hadoop-common-project/hadoop-common/src/site/markdown/Tracing.md index bf5685c..7897855 100644 --- a/hadoop-common-project/hadoop-common/src/site/markdown/Tracing.md +++ b/hadoop-common-project/hadoop-common/src/site/markdown/Tracing.md @@ -49,37 +49,14 @@ interface bundled with HTrace or implementing it by yourself. * HTracedRESTReceiver * ZipkinSpanReceiver -In order to set up SpanReceivers for HDFS servers, -configure what SpanReceivers you'd like to use -by putting a comma separated list of the fully-qualified class name of classes implementing SpanReceiver -in `hdfs-site.xml` property: `dfs.htrace.spanreceiver.classes`. +See core-default.xml for a description of HTrace configuration keys. In some +cases, you will also need to add the jar containing the SpanReceiver that you +are using to the classpath of Hadoop on each node. (In the example above, +LocalFileSpanReceiver is included in the htrace-core4 jar which is bundled +with Hadoop.) -```xml - - dfs.htrace.spanreceiver.classes - org.apache.htrace.impl.LocalFileSpanReceiver - - - dfs.htrace.local-file-span-receiver.path - /var/log/hadoop/htrace.out - -``` - -You can omit package name prefix if you use span receiver bundled with HTrace. - -```xml - - dfs.htrace.spanreceiver.classes - LocalFileSpanReceiver - ``` - -You also need to add the jar bundling SpanReceiver to the classpath of Hadoop -on each node. (LocalFileSpanReceiver in the example above is included in the -jar of htrace-core which is bundled with Hadoop.) - -``` - $ cp htrace-htraced/target/htrace-htraced-3.2.0-incubating.jar $HADOOP_HOME/share/hadoop/common/lib/ + $ cp htrace-htraced/target/htrace-htraced-4.0.1-incubating.jar $HADOOP_HOME/share/hadoop/common/lib/ ``` ### Dynamic update of tracing configuration @@ -92,11 +69,11 @@ You need to run the command against all servers if you want to update the config $ hadoop trace -list -host 192.168.56.2:9000 ID CLASS - 1 org.apache.htrace.impl.LocalFileSpanReceiver + 1 org.apache.htrace.core.LocalFileSpanReceiver $ hadoop trace -list -host 192.168.56.2:50020 ID CLASS - 1 org.apache.htrace.impl.LocalFileSpanReceiver + 1 org.apache.htrace.core.LocalFileSpanReceiver `hadoop trace -remove` removes span receiver from server. `-remove` options takes id of span receiver as argument. @@ -113,7 +90,7 @@ You can specify the configuration associated with span receiver by `-Ckey=value` $ hadoop trace -list -host 192.168.56.2:9000 ID CLASS - 2 org.apache.htrace.impl.LocalFileSpanReceiver + 2 org.apache.htrace.core.LocalFileSpanReceiver ### Starting tracing spans by HTrace API @@ -121,26 +98,21 @@ In order to trace, you will need to wrap the traced logic with **tracing span** When there is running tracing spans, the tracing information is propagated to servers along with RPC requests. -In addition, you need to initialize `SpanReceiverHost` once per process. - ```java import org.apache.hadoop.hdfs.HdfsConfiguration; - import org.apache.hadoop.tracing.SpanReceiverHost; - import org.apache.htrace.Sampler; - import org.apache.htrace.Trace; - import org.apache.htrace.TraceScope; + import org.apache.htrace.core.Tracer; + import org.apache.htrace.core.TraceScope; ... - SpanReceiverHost.getInstance(new HdfsConfiguration()); ... - TraceScope ts = Trace.startSpan("Gets", Sampler.ALWAYS); + TraceScope ts = tracer.newScope("Gets"); try { ... // traced logic } finally { - if (ts != null) ts.close(); + ts.close(); } ``` @@ -154,11 +126,10 @@ which start tracing span before invoking HDFS shell command. import org.apache.hadoop.fs.FsShell; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.HdfsConfiguration; - import org.apache.hadoop.tracing.SpanReceiverHost; + import org.apache.hadoop.tracing.TraceUtils; import org.apache.hadoop.util.ToolRunner; - import org.apache.htrace.Sampler; - import org.apache.htrace.Trace; - import org.apache.htrace.TraceScope; + import org.apache.htrace.core.Trace; + import org.apache.htrace.core.TraceScope; public class TracingFsShell { public static void main(String argv[]) throws Exception { @@ -166,13 +137,19 @@ which start tracing span before invoking HDFS shell command. FsShell shell = new FsShell(); conf.setQuietMode(false); shell.setConf(conf); - SpanReceiverHost.get(conf, DFSConfigKeys.DFS_SERVER_HTRACE_PREFIX); + Tracer tracer = new Tracer.Builder(). + name("TracingFsShell). + conf(TraceUtils.wrapHadoopConf("tracing.fs.shell.htrace.", conf)). + build(); int res = 0; - try (TraceScope ts = Trace.startSpan("FsShell", Sampler.ALWAYS)) { + TraceScope scope = tracer.newScope("FsShell"); + try { res = ToolRunner.run(shell, argv); } finally { + scope.close(); shell.close(); } + tracer.close(); System.exit(res); } } @@ -189,16 +166,15 @@ The DFSClient can enable tracing internally. This allows you to use HTrace with your client without modifying the client source code. Configure the span receivers and samplers in `hdfs-site.xml` -by properties `dfs.client.htrace.sampler` and `dfs.client.htrace.sampler`. -The value of `dfs.client.htrace.sampler` can be NeverSampler, AlwaysSampler or ProbabilitySampler. +by properties `fs.client.htrace.sampler.classes` and +`fs.client.htrace.spanreceiver.classes`. The value of +`fs.client.htrace.sampler.classes` can be NeverSampler, AlwaysSampler or +ProbabilitySampler. * NeverSampler: HTrace is OFF for all requests to namenodes and datanodes; * AlwaysSampler: HTrace is ON for all requests to namenodes and datanodes; * ProbabilitySampler: HTrace is ON for some percentage% of requests to namenodes and datanodes -You do not need to enable this if your client program has been modified -to use HTrace. - ```xml dfs.client.htrace.spanreceiver.classes http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShell.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShell.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShell.java index cc93d68..376f8a6 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShell.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShell.java @@ -24,10 +24,9 @@ import junit.framework.AssertionFailedError; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.tracing.SetSpanReceiver; -import org.apache.hadoop.tracing.SpanReceiverHost; import org.apache.hadoop.util.ToolRunner; -import org.apache.htrace.SamplerBuilder; -import org.apache.htrace.impl.AlwaysSampler; +import org.apache.htrace.core.AlwaysSampler; +import org.apache.htrace.core.Tracer; import org.junit.Assert; import org.junit.Test; @@ -53,10 +52,10 @@ public class TestFsShell { @Test public void testTracing() throws Throwable { Configuration conf = new Configuration(); - String prefix = FsShell.SEHLL_HTRACE_PREFIX; - conf.set(prefix + SpanReceiverHost.SPAN_RECEIVERS_CONF_SUFFIX, + String prefix = "fs.shell.htrace."; + conf.set(prefix + Tracer.SPAN_RECEIVER_CLASSES_KEY, SetSpanReceiver.class.getName()); - conf.set(prefix + SamplerBuilder.SAMPLER_CONF_KEY, + conf.set(prefix + Tracer.SAMPLER_CLASSES_KEY, AlwaysSampler.class.getName()); conf.setQuietMode(false); FsShell shell = new FsShell(conf); http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/SetSpanReceiver.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/SetSpanReceiver.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/SetSpanReceiver.java index 97ca7c4..2bc68ce 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/SetSpanReceiver.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/SetSpanReceiver.java @@ -19,9 +19,10 @@ package org.apache.hadoop.tracing; import com.google.common.base.Supplier; import org.apache.hadoop.test.GenericTestUtils; -import org.apache.htrace.Span; -import org.apache.htrace.SpanReceiver; -import org.apache.htrace.HTraceConfiguration; +import org.apache.htrace.core.Span; +import org.apache.htrace.core.SpanId; +import org.apache.htrace.core.SpanReceiver; +import org.apache.htrace.core.HTraceConfiguration; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; @@ -39,7 +40,7 @@ import org.junit.Assert; * push all the metrics to a static place, and would make testing * SpanReceiverHost harder. */ -public class SetSpanReceiver implements SpanReceiver { +public class SetSpanReceiver extends SpanReceiver { public SetSpanReceiver(HTraceConfiguration conf) { } @@ -68,8 +69,8 @@ public class SetSpanReceiver implements SpanReceiver { } public static class SetHolder { - public static ConcurrentHashMap spans = - new ConcurrentHashMap(); + public static ConcurrentHashMap spans = + new ConcurrentHashMap(); public static Map> getMap() { Map> map = new HashMap>(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/tracing/TestTraceUtils.java ---------------------------------------------------------------------- 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 400d003..75411da 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 @@ -21,7 +21,7 @@ import static org.junit.Assert.assertEquals; import java.util.LinkedList; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.tracing.SpanReceiverInfo.ConfigurationPair; -import org.apache.htrace.HTraceConfiguration; +import org.apache.htrace.core.HTraceConfiguration; import org.junit.Test; public class TestTraceUtils { http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderFactory.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderFactory.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderFactory.java index 69e9da2..273d8cf 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderFactory.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderFactory.java @@ -66,6 +66,7 @@ import org.apache.hadoop.util.Time; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import org.apache.htrace.core.Tracer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -179,6 +180,11 @@ public class BlockReaderFactory implements ShortCircuitReplicaCreator { private Configuration configuration; /** + * The HTrace tracer to use. + */ + private Tracer tracer; + + /** * Information about the domain socket path we should use to connect to the * local peer-- or null if we haven't examined the local domain socket. */ @@ -282,6 +288,11 @@ public class BlockReaderFactory implements ShortCircuitReplicaCreator { return this; } + public BlockReaderFactory setTracer(Tracer tracer) { + this.tracer = tracer; + return this; + } + @VisibleForTesting public static void setFailureInjectorForTesting(FailureInjector injector) { failureInjector = injector; @@ -435,7 +446,7 @@ public class BlockReaderFactory implements ShortCircuitReplicaCreator { try { return BlockReaderLocalLegacy.newBlockReader(conf, userGroupInformation, configuration, fileName, block, token, - datanode, startOffset, length, storageType); + datanode, startOffset, length, storageType, tracer); } catch (RemoteException remoteException) { ioe = remoteException.unwrapRemoteException( InvalidToken.class, AccessControlException.class); @@ -496,6 +507,7 @@ public class BlockReaderFactory implements ShortCircuitReplicaCreator { setVerifyChecksum(verifyChecksum). setCachingStrategy(cachingStrategy). setStorageType(storageType). + setTracer(tracer). build(); } @@ -865,12 +877,12 @@ public class BlockReaderFactory implements ShortCircuitReplicaCreator { return RemoteBlockReader.newBlockReader(fileName, block, token, startOffset, length, conf.getIoBufferSize(), verifyChecksum, clientName, peer, datanode, - clientContext.getPeerCache(), cachingStrategy); + clientContext.getPeerCache(), cachingStrategy, tracer); } else { return RemoteBlockReader2.newBlockReader( fileName, block, token, startOffset, length, verifyChecksum, clientName, peer, datanode, - clientContext.getPeerCache(), cachingStrategy); + clientContext.getPeerCache(), cachingStrategy, tracer); } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocal.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocal.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocal.java index 2a0e21b..62e7af6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocal.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocal.java @@ -34,9 +34,8 @@ import org.apache.hadoop.hdfs.shortcircuit.ClientMmap; import org.apache.hadoop.hdfs.shortcircuit.ShortCircuitReplica; import org.apache.hadoop.util.DataChecksum; import org.apache.hadoop.util.DirectBufferPool; -import org.apache.htrace.Sampler; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -75,6 +74,7 @@ class BlockReaderLocal implements BlockReader { private long dataPos; private ExtendedBlock block; private StorageType storageType; + private Tracer tracer; public Builder(ShortCircuitConf conf) { this.maxReadahead = Integer.MAX_VALUE; @@ -120,6 +120,11 @@ class BlockReaderLocal implements BlockReader { return this; } + public Builder setTracer(Tracer tracer) { + this.tracer = tracer; + return this; + } + public BlockReaderLocal build() { Preconditions.checkNotNull(replica); return new BlockReaderLocal(this); @@ -228,6 +233,11 @@ class BlockReaderLocal implements BlockReader { */ private StorageType storageType; + /** + * The Tracer to use. + */ + private final Tracer tracer; + private BlockReaderLocal(Builder builder) { this.replica = builder.replica; this.dataIn = replica.getDataStream().getChannel(); @@ -257,6 +267,7 @@ class BlockReaderLocal implements BlockReader { } this.maxReadaheadLength = maxReadaheadChunks * bytesPerChecksum; this.storageType = builder.storageType; + this.tracer = builder.tracer; } private synchronized void createDataBufIfNeeded() { @@ -324,8 +335,8 @@ class BlockReaderLocal implements BlockReader { */ private synchronized int fillBuffer(ByteBuffer buf, boolean canSkipChecksum) throws IOException { - TraceScope scope = Trace.startSpan("BlockReaderLocal#fillBuffer(" + - block.getBlockId() + ")", Sampler.NEVER); + TraceScope scope = tracer.newScope( + "BlockReaderLocal#fillBuffer(" + block.getBlockId() + ")"); try { int total = 0; long startDataPos = dataPos; http://git-wip-us.apache.org/repos/asf/hadoop/blob/892ade68/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocalLegacy.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocalLegacy.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocalLegacy.java index eea3f06..5235287 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocalLegacy.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/BlockReaderLocalLegacy.java @@ -50,10 +50,8 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.util.DataChecksum; import org.apache.hadoop.util.DirectBufferPool; -import org.apache.htrace.Sampler; -import org.apache.htrace.Trace; -import org.apache.htrace.TraceScope; - +import org.apache.htrace.core.TraceScope; +import org.apache.htrace.core.Tracer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -182,7 +180,8 @@ class BlockReaderLocalLegacy implements BlockReader { private long startOffset; private final String filename; private long blockId; - + private final Tracer tracer; + /** * The only way this object can be instantiated. */ @@ -190,8 +189,8 @@ class BlockReaderLocalLegacy implements BlockReader { UserGroupInformation userGroupInformation, Configuration configuration, String file, ExtendedBlock blk, Token token, DatanodeInfo node, - long startOffset, long length, StorageType storageType) - throws IOException { + long startOffset, long length, StorageType storageType, + Tracer tracer) throws IOException { final ShortCircuitConf scConf = conf.getShortCircuitConf(); LocalDatanodeInfo localDatanodeInfo = getLocalDatanodeInfo(node .getIpcPort()); @@ -239,10 +238,10 @@ class BlockReaderLocalLegacy implements BlockReader { - (startOffset % checksum.getBytesPerChecksum()); localBlockReader = new BlockReaderLocalLegacy(scConf, file, blk, token, startOffset, length, pathinfo, checksum, true, dataIn, - firstChunkOffset, checksumIn); + firstChunkOffset, checksumIn, tracer); } else { localBlockReader = new BlockReaderLocalLegacy(scConf, file, blk, token, - startOffset, length, pathinfo, dataIn); + startOffset, length, pathinfo, dataIn, tracer); } } catch (IOException e) { // remove from cache @@ -321,18 +320,18 @@ class BlockReaderLocalLegacy implements BlockReader { private BlockReaderLocalLegacy(ShortCircuitConf conf, String hdfsfile, ExtendedBlock block, Token token, long startOffset, - long length, BlockLocalPathInfo pathinfo, FileInputStream dataIn) - throws IOException { + long length, BlockLocalPathInfo pathinfo, FileInputStream dataIn, + Tracer tracer) throws IOException { this(conf, hdfsfile, block, token, startOffset, length, pathinfo, DataChecksum.newDataChecksum(DataChecksum.Type.NULL, 4), false, - dataIn, startOffset, null); + dataIn, startOffset, null, tracer); } private BlockReaderLocalLegacy(ShortCircuitConf conf, String hdfsfile, ExtendedBlock block, Token token, long startOffset, long length, BlockLocalPathInfo pathinfo, DataChecksum checksum, boolean verifyChecksum, FileInputStream dataIn, long firstChunkOffset, - FileInputStream checksumIn) throws IOException { + FileInputStream checksumIn, Tracer tracer) throws IOException { this.filename = hdfsfile; this.checksum = checksum; this.verifyChecksum = verifyChecksum; @@ -368,6 +367,7 @@ class BlockReaderLocalLegacy implements BlockReader { bufferPool.returnBuffer(checksumBuff); } } + this.tracer = tracer; } /** @@ -375,8 +375,8 @@ class BlockReaderLocalLegacy implements BlockReader { */ private int fillBuffer(FileInputStream stream, ByteBuffer buf) throws IOException { - TraceScope scope = Trace.startSpan("BlockReaderLocalLegacy#fillBuffer(" + - blockId + ")", Sampler.NEVER); + TraceScope scope = tracer. + newScope("BlockReaderLocalLegacy#fillBuffer(" + blockId + ")"); try { int bytesRead = stream.getChannel().read(buf); if (bytesRead < 0) {