You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by zh...@apache.org on 2015/09/30 17:41:20 UTC
[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 <cm...@cloudera.com>
Authored: Sat Sep 26 22:05:51 2015 -0700
Committer: Colin Patrick Mccabe <cm...@cloudera.com>
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 @@
<dependency>
<groupId>org.apache.htrace</groupId>
- <artifactId>htrace-core</artifactId>
+ <artifactId>htrace-core4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
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<Path> deleteOnExit = new TreeSet<Path>();
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<AuthMethod> 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<String, SpanReceiverHost> hosts =
- new HashMap<String, SpanReceiverHost>(1);
- private final TreeMap<Long, SpanReceiver> receivers =
- new TreeMap<Long, SpanReceiver>();
- 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<ConfigurationPair> 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<ConfigurationPair> 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<Long, SpanReceiver> 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<ConfigurationPair> 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.
</description>
</property>
+
+ <property>
+ <name>fs.client.htrace.sampler.classes</name>
+ <value></value>
+ <description>The class names of the HTrace Samplers to use for Hadoop
+ filesystem clients.
+ </description>
+ </property>
+
+ <property>
+ <name>hadoop.htrace.span.receiver.classes</name>
+ <value></value>
+ <description>The class names of the Span Receivers to use for Hadoop.
+ </description>
+ </property>
</configuration>
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
- <property>
- <name>dfs.htrace.spanreceiver.classes</name>
- <value>org.apache.htrace.impl.LocalFileSpanReceiver</value>
- </property>
- <property>
- <name>dfs.htrace.local-file-span-receiver.path</name>
- <value>/var/log/hadoop/htrace.out</value>
- </property>
-```
-
-You can omit package name prefix if you use span receiver bundled with HTrace.
-
-```xml
- <property>
- <name>dfs.htrace.spanreceiver.classes</name>
- <value>LocalFileSpanReceiver</value>
- </property>
```
-
-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
<property>
<name>dfs.client.htrace.spanreceiver.classes</name>
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<Long, Span> spans =
- new ConcurrentHashMap<Long, Span>();
+ public static ConcurrentHashMap<SpanId, Span> spans =
+ new ConcurrentHashMap<SpanId, Span>();
public static Map<String, List<Span>> getMap() {
Map<String, List<Span>> map = new HashMap<String, List<Span>>();
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<BlockTokenIdentifier> 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<BlockTokenIdentifier> 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<BlockTokenIdentifier> 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) {