This is an automated email from the ASF dual-hosted git repository.
ndimiduk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new 9c037b1b HBASE-26764 Implement generic exception support for TraceUtil
methods over Callables and Runnables
9c037b1b is described below
commit 9c037b1be7c35ed715ad471acb93b0d0084394e3
Author: Nick Dimiduk <[email protected]>
AuthorDate: Fri Feb 18 16:04:51 2022 +0100
HBASE-26764 Implement generic exception support for TraceUtil methods over
Callables and Runnables
For the `TraceUtil` methods that accept `Callable` and `Runnable` types,
make them generic over a
child of `Throwable`. This allows us to consolidate the two method
signatures into a single more
flexible definition.
Signed-off-by: Duo Zhang <[email protected]>
---
.../hadoop/hbase/client/AsyncConnectionImpl.java | 12 +---
.../org/apache/hadoop/hbase/trace/TraceUtil.java | 70 ++++++++++++----------
.../hbase/regionserver/wal/AbstractFSWAL.java | 10 +---
3 files changed, 43 insertions(+), 49 deletions(-)
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java
index 506962f..4de9a2c 100644
---
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java
+++
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java
@@ -27,7 +27,6 @@ import static
org.apache.hadoop.hbase.client.MetricsConnection.CLIENT_SIDE_METRI
import static
org.apache.hadoop.hbase.client.NonceGenerator.CLIENT_NONCES_ENABLED_KEY;
import static
org.apache.hadoop.hbase.trace.HBaseSemanticAttributes.SERVER_NAME_KEY;
import static org.apache.hadoop.hbase.util.FutureUtils.addListener;
-
import io.opentelemetry.api.trace.Span;
import java.io.IOException;
import java.net.SocketAddress;
@@ -40,7 +39,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Supplier;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.AuthUtil;
@@ -61,10 +59,8 @@ import org.apache.hadoop.security.UserGroupInformation;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import
org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer;
-
import
org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;
@@ -444,13 +440,7 @@ public class AsyncConnectionImpl implements
AsyncConnection {
@Override
public Hbck getHbck(ServerName masterServer) {
- return TraceUtil.trace(new Supplier<Hbck>() {
-
- @Override
- public Hbck get() {
- return getHbckInternal(masterServer);
- }
- }, "AsyncConnection.getHbck");
+ return TraceUtil.trace(() -> getHbckInternal(masterServer),
"AsyncConnection.getHbck");
}
Optional<MetricsConnection> getConnectionMetrics() {
diff --git
a/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
b/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
index 27f195d..7aa7988 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
@@ -24,8 +24,8 @@ import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
-import java.io.IOException;
import java.util.List;
+import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
import org.apache.hadoop.hbase.Version;
@@ -84,7 +84,7 @@ public final class TraceUtil {
Supplier<Span> spanSupplier
) {
Span span = spanSupplier.get();
- try (Scope scope = span.makeCurrent()) {
+ try (Scope ignored = span.makeCurrent()) {
CompletableFuture<T> future = action.get();
endSpan(future, span);
return future;
@@ -97,7 +97,7 @@ public final class TraceUtil {
public static <T> CompletableFuture<T>
tracedFuture(Supplier<CompletableFuture<T>> action,
String spanName) {
Span span = createSpan(spanName);
- try (Scope scope = span.makeCurrent()) {
+ try (Scope ignored = span.makeCurrent()) {
CompletableFuture<T> future = action.get();
endSpan(future, span);
return future;
@@ -113,7 +113,7 @@ public final class TraceUtil {
Supplier<Span> spanSupplier
) {
Span span = spanSupplier.get();
- try (Scope scope = span.makeCurrent()) {
+ try (Scope ignored = span.makeCurrent()) {
List<CompletableFuture<T>> futures = action.get();
endSpan(CompletableFuture.allOf(futures.toArray(new
CompletableFuture[0])), span);
return futures;
@@ -139,29 +139,29 @@ public final class TraceUtil {
});
}
- public static void trace(Runnable action, String spanName) {
- trace(action, () -> createSpan(spanName));
+ /**
+ * A {@link Runnable} that may also throw.
+ * @param <T> the type of {@link Throwable} that can be produced.
+ */
+ @FunctionalInterface
+ public interface ThrowingRunnable<T extends Throwable> {
+ void run() throws T;
}
- public static void trace(Runnable action, Supplier<Span> creator) {
- Span span = creator.get();
- try (Scope scope = span.makeCurrent()) {
- action.run();
- span.setStatus(StatusCode.OK);
- } catch (Throwable e) {
- setError(span, e);
- throw e;
- } finally {
- span.end();
- }
+ public static <T extends Throwable> void trace(
+ final ThrowingRunnable<T> runnable,
+ final String spanName) throws T {
+ trace(runnable, () -> createSpan(spanName));
}
- public static <T> T trace(Supplier<T> action, String spanName) {
- Span span = createSpan(spanName);
- try (Scope scope = span.makeCurrent()) {
- T ret = action.get();
+ public static <T extends Throwable> void trace(
+ final ThrowingRunnable<T> runnable,
+ final Supplier<Span> spanSupplier
+ ) throws T {
+ Span span = spanSupplier.get();
+ try (Scope ignored = span.makeCurrent()) {
+ runnable.run();
span.setStatus(StatusCode.OK);
- return ret;
} catch (Throwable e) {
setError(span, e);
throw e;
@@ -170,20 +170,30 @@ public final class TraceUtil {
}
}
+ /**
+ * A {@link Callable} that may also throw.
+ * @param <R> the result type of method call.
+ * @param <T> the type of {@link Throwable} that can be produced.
+ */
@FunctionalInterface
- public interface IOExceptionCallable<V> {
- V call() throws IOException;
+ public interface ThrowingCallable<R, T extends Throwable> {
+ R call() throws T;
}
- public static <T> T trace(IOExceptionCallable<T> callable, String spanName)
throws IOException {
+ public static <R, T extends Throwable> R trace(
+ final ThrowingCallable<R, T> callable,
+ final String spanName
+ ) throws T {
return trace(callable, () -> createSpan(spanName));
}
- public static <T> T trace(IOExceptionCallable<T> callable, Supplier<Span>
creator)
- throws IOException {
- Span span = creator.get();
- try (Scope scope = span.makeCurrent()) {
- T ret = callable.call();
+ public static <R, T extends Throwable> R trace(
+ final ThrowingCallable<R, T> callable,
+ final Supplier<Span> spanSupplier
+ ) throws T {
+ Span span = spanSupplier.get();
+ try (Scope ignored = span.makeCurrent()) {
+ final R ret = callable.call();
span.setStatus(StatusCode.OK);
return ret;
} catch (Throwable e) {
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
index 6d1ef96..de8a6af 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
@@ -590,18 +590,12 @@ public abstract class AbstractFSWAL<W extends WriterBase>
implements WAL {
@Override
public final void sync(boolean forceSync) throws IOException {
- TraceUtil.trace(() -> {
- doSync(forceSync);
- return null;
- }, () -> createSpan("WAL.sync"));
+ TraceUtil.trace(() -> doSync(forceSync), () -> createSpan("WAL.sync"));
}
@Override
public final void sync(long txid, boolean forceSync) throws IOException {
- TraceUtil.trace(() -> {
- doSync(txid, forceSync);
- return null;
- }, () -> createSpan("WAL.sync"));
+ TraceUtil.trace(() -> doSync(txid, forceSync), () ->
createSpan("WAL.sync"));
}
protected abstract void doSync(boolean forceSync) throws IOException;