Skip to content

Commit a637774

Browse files
sanjeet006pyvirajjasani
authored andcommitted
HBASE-29626: Refactor server side scan metrics for Coproc hooks (#7340)
Signed-off-by: Viraj Jasani <[email protected]>
1 parent 5cf0a97 commit a637774

File tree

10 files changed

+34
-82
lines changed

10 files changed

+34
-82
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import org.apache.hadoop.hbase.io.compress.Compression;
4141
import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
4242
import org.apache.hadoop.hbase.io.hfile.ReaderContext.ReaderType;
43-
import org.apache.hadoop.hbase.ipc.RpcServer;
43+
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
4444
import org.apache.hadoop.hbase.regionserver.CellSink;
4545
import org.apache.hadoop.hbase.regionserver.ShipperListener;
4646
import org.apache.hadoop.hbase.regionserver.TimeRangeTracker;
@@ -190,7 +190,7 @@ public static final long getChecksumFailuresCount() {
190190
}
191191

192192
public static final void updateReadLatency(long latencyMillis, boolean pread, boolean tooSlow) {
193-
RpcServer.getCurrentCall().ifPresent(call -> call.updateFsReadTime(latencyMillis));
193+
ThreadLocalServerSideScanMetrics.addFsReadTime(latencyMillis);
194194
if (pread) {
195195
MetricsIO.getInstance().updateFsPreadTime(latencyMillis);
196196
} else {

hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcCall.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,4 @@ void setResponse(Message param, ExtendedCellScanner cells, Throwable errorThrowa
133133

134134
/** Returns A short string format of this call without possibly lengthy params */
135135
String toShortString();
136-
137-
void updateFsReadTime(long latencyMillis);
138-
139-
long getFsReadTime();
140136
}

hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.apache.hadoop.hbase.io.ByteBuffAllocator;
4747
import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
4848
import org.apache.hadoop.hbase.monitoring.TaskMonitor;
49+
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
4950
import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;
5051
import org.apache.hadoop.hbase.namequeues.RpcLogDetails;
5152
import org.apache.hadoop.hbase.regionserver.RSRpcServices;
@@ -461,19 +462,18 @@ public Pair<Message, ExtendedCellScanner> call(RpcCall call, MonitoredRPCHandler
461462
int processingTime = (int) (endTime - startTime);
462463
int qTime = (int) (startTime - receiveTime);
463464
int totalTime = (int) (endTime - receiveTime);
465+
long fsReadTime = ThreadLocalServerSideScanMetrics.getFsReadTimeCounter().get();
464466
if (LOG.isTraceEnabled()) {
465467
LOG.trace(
466468
"{}, response: {}, receiveTime: {}, queueTime: {}, processingTime: {}, "
467469
+ "totalTime: {}, fsReadTime: {}",
468470
CurCall.get().toString(), TextFormat.shortDebugString(result),
469-
CurCall.get().getReceiveTime(), qTime, processingTime, totalTime,
470-
CurCall.get().getFsReadTime());
471+
CurCall.get().getReceiveTime(), qTime, processingTime, totalTime, fsReadTime);
471472
}
472473
// Use the raw request call size for now.
473474
long requestSize = call.getSize();
474475
long responseSize = result.getSerializedSize();
475476
long responseBlockSize = call.getBlockBytesScanned();
476-
long fsReadTime = call.getFsReadTime();
477477
if (call.isClientCellBlockSupported()) {
478478
// Include the payload size in HBaseRpcController
479479
responseSize += call.getResponseCellSize();

hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/ServerCall.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public abstract class ServerCall<T extends ServerRpcConnection> implements RpcCa
101101

102102
private long responseCellSize = 0;
103103
private long responseBlockSize = 0;
104-
private long fsReadTimeMillis = 0;
105104
// cumulative size of serialized exceptions
106105
private long exceptionSize = 0;
107106
private final boolean retryImmediatelySupported;
@@ -604,14 +603,4 @@ public int getRemotePort() {
604603
public synchronized BufferChain getResponse() {
605604
return response;
606605
}
607-
608-
@Override
609-
public void updateFsReadTime(long latencyMillis) {
610-
fsReadTimeMillis += latencyMillis;
611-
}
612-
613-
@Override
614-
public long getFsReadTime() {
615-
return fsReadTimeMillis;
616-
}
617606
}

hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/ThreadLocalServerSideScanMetrics.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
package org.apache.hadoop.hbase.monitoring;
1919

2020
import java.util.concurrent.atomic.AtomicLong;
21+
import org.apache.hadoop.hbase.HBaseInterfaceAudience;
2122
import org.apache.hadoop.hbase.client.metrics.ServerSideScanMetrics;
2223
import org.apache.hadoop.hbase.regionserver.RegionScanner;
2324
import org.apache.hadoop.hbase.regionserver.ScannerContext;
2425
import org.apache.yetus.audience.InterfaceAudience;
26+
import org.apache.yetus.audience.InterfaceStability;
2527

2628
/**
2729
* Thread-local storage for server-side scan metrics that captures performance data separately for
@@ -61,7 +63,8 @@
6163
* @see RegionScanner
6264
* @see org.apache.hadoop.hbase.regionserver.handler.ParallelSeekHandler
6365
*/
64-
@InterfaceAudience.Private
66+
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.PHOENIX)
67+
@InterfaceStability.Evolving
6568
public final class ThreadLocalServerSideScanMetrics {
6669
private ThreadLocalServerSideScanMetrics() {
6770
}
@@ -81,6 +84,9 @@ private ThreadLocalServerSideScanMetrics() {
8184
private static final ThreadLocal<AtomicLong> BLOCK_READ_OPS_COUNT =
8285
ThreadLocal.withInitial(() -> new AtomicLong(0));
8386

87+
private static final ThreadLocal<AtomicLong> FS_READ_TIME =
88+
ThreadLocal.withInitial(() -> new AtomicLong(0));
89+
8490
public static void setScanMetricsEnabled(boolean enable) {
8591
IS_SCAN_METRICS_ENABLED.set(enable);
8692
}
@@ -101,6 +107,10 @@ public static long addBlockReadOpsCount(long count) {
101107
return BLOCK_READ_OPS_COUNT.get().addAndGet(count);
102108
}
103109

110+
public static long addFsReadTime(long time) {
111+
return FS_READ_TIME.get().addAndGet(time);
112+
}
113+
104114
public static boolean isScanMetricsEnabled() {
105115
return IS_SCAN_METRICS_ENABLED.get();
106116
}
@@ -121,6 +131,10 @@ public static AtomicLong getBlockReadOpsCountCounter() {
121131
return BLOCK_READ_OPS_COUNT.get();
122132
}
123133

134+
public static AtomicLong getFsReadTimeCounter() {
135+
return FS_READ_TIME.get();
136+
}
137+
124138
public static long getBytesReadFromFsAndReset() {
125139
return getBytesReadFromFsCounter().getAndSet(0);
126140
}
@@ -137,11 +151,16 @@ public static long getBlockReadOpsCountAndReset() {
137151
return getBlockReadOpsCountCounter().getAndSet(0);
138152
}
139153

154+
public static long getFsReadTimeAndReset() {
155+
return getFsReadTimeCounter().getAndSet(0);
156+
}
157+
140158
public static void reset() {
141159
getBytesReadFromFsAndReset();
142160
getBytesReadFromBlockCacheAndReset();
143161
getBytesReadFromMemstoreAndReset();
144162
getBlockReadOpsCountAndReset();
163+
getFsReadTimeAndReset();
145164
}
146165

147166
public static void populateServerSideScanMetrics(ServerSideScanMetrics metrics) {
@@ -156,5 +175,7 @@ public static void populateServerSideScanMetrics(ServerSideScanMetrics metrics)
156175
getBytesReadFromMemstoreCounter().get());
157176
metrics.addToCounter(ServerSideScanMetrics.BLOCK_READ_OPS_COUNT_METRIC_NAME,
158177
getBlockReadOpsCountCounter().get());
178+
metrics.addToCounter(ServerSideScanMetrics.FS_READ_TIME_METRIC_NAME,
179+
getFsReadTimeCounter().get());
159180
}
160181
}

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
import org.apache.hadoop.hbase.ipc.RpcServerInterface;
104104
import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
105105
import org.apache.hadoop.hbase.ipc.ServerRpcController;
106+
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
106107
import org.apache.hadoop.hbase.net.Address;
107108
import org.apache.hadoop.hbase.procedure2.RSProcedureCallable;
108109
import org.apache.hadoop.hbase.quotas.ActivePolicyEnforcement;
@@ -3519,10 +3520,6 @@ private void scan(HBaseRpcController controller, ScanRequest request, RegionScan
35193520
// from block size progress before writing into the response
35203521
scanMetrics.setCounter(ServerSideScanMetrics.BLOCK_BYTES_SCANNED_KEY_METRIC_NAME,
35213522
scannerContext.getBlockSizeProgress());
3522-
if (rpcCall != null) {
3523-
scanMetrics.setCounter(ServerSideScanMetrics.FS_READ_TIME_METRIC_NAME,
3524-
rpcCall.getFsReadTime());
3525-
}
35263523
}
35273524
}
35283525
} finally {
@@ -3589,6 +3586,11 @@ public ScanResponse scan(final RpcController controller, final ScanRequest reque
35893586
}
35903587
throw new ServiceException(e);
35913588
}
3589+
boolean trackMetrics = request.hasTrackScanMetrics() && request.getTrackScanMetrics();
3590+
ThreadLocalServerSideScanMetrics.setScanMetricsEnabled(trackMetrics);
3591+
if (trackMetrics) {
3592+
ThreadLocalServerSideScanMetrics.reset();
3593+
}
35923594
requestCount.increment();
35933595
rpcScanRequestCount.increment();
35943596
RegionScannerContext rsx;
@@ -3659,7 +3661,6 @@ public ScanResponse scan(final RpcController controller, final ScanRequest reque
36593661
boolean scannerClosed = false;
36603662
try {
36613663
List<Result> results = new ArrayList<>(Math.min(rows, 512));
3662-
boolean trackMetrics = request.hasTrackScanMetrics() && request.getTrackScanMetrics();
36633664
ServerSideScanMetrics scanMetrics = trackMetrics ? new ServerSideScanMetrics() : null;
36643665
if (rows > 0) {
36653666
boolean done = false;
@@ -3741,6 +3742,7 @@ public ScanResponse scan(final RpcController controller, final ScanRequest reque
37413742
scanMetrics.addToCounter(ServerSideScanMetrics.RPC_SCAN_QUEUE_WAIT_TIME_METRIC_NAME,
37423743
rpcQueueWaitTime);
37433744
}
3745+
ThreadLocalServerSideScanMetrics.populateServerSideScanMetrics(scanMetrics);
37443746
Map<String, Long> metrics = scanMetrics.getMetricsMap();
37453747
ScanMetrics.Builder metricBuilder = ScanMetrics.newBuilder();
37463748
NameInt64Pair.Builder pairBuilder = NameInt64Pair.newBuilder();

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScannerImpl.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import org.apache.hadoop.hbase.ipc.RpcCall;
4646
import org.apache.hadoop.hbase.ipc.RpcCallback;
4747
import org.apache.hadoop.hbase.ipc.RpcServer;
48-
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
4948
import org.apache.hadoop.hbase.regionserver.Region.Operation;
5049
import org.apache.hadoop.hbase.regionserver.ScannerContext.LimitScope;
5150
import org.apache.hadoop.hbase.regionserver.ScannerContext.NextState;
@@ -96,8 +95,6 @@ public class RegionScannerImpl implements RegionScanner, Shipper, RpcCallback {
9695

9796
private RegionServerServices rsServices;
9897

99-
private ServerSideScanMetrics scannerInitMetrics = null;
100-
10198
@Override
10299
public RegionInfo getRegionInfo() {
103100
return region.getRegionInfo();
@@ -148,16 +145,7 @@ private static boolean hasNonce(HRegion region, long nonce) {
148145
} finally {
149146
region.smallestReadPointCalcLock.unlock(ReadPointCalculationLock.LockType.RECORDING_LOCK);
150147
}
151-
boolean isScanMetricsEnabled = scan.isScanMetricsEnabled();
152-
ThreadLocalServerSideScanMetrics.setScanMetricsEnabled(isScanMetricsEnabled);
153-
if (isScanMetricsEnabled) {
154-
this.scannerInitMetrics = new ServerSideScanMetrics();
155-
ThreadLocalServerSideScanMetrics.reset();
156-
}
157148
initializeScanners(scan, additionalScanners);
158-
if (isScanMetricsEnabled) {
159-
ThreadLocalServerSideScanMetrics.populateServerSideScanMetrics(scannerInitMetrics);
160-
}
161149
}
162150

163151
public ScannerContext getContext() {
@@ -291,16 +279,6 @@ public boolean nextRaw(List<? super ExtendedCell> outResults, ScannerContext sca
291279
throw new UnknownScannerException("Scanner was closed");
292280
}
293281
boolean moreValues = false;
294-
boolean isScanMetricsEnabled = scannerContext.isTrackingMetrics();
295-
ThreadLocalServerSideScanMetrics.setScanMetricsEnabled(isScanMetricsEnabled);
296-
if (isScanMetricsEnabled) {
297-
ThreadLocalServerSideScanMetrics.reset();
298-
ServerSideScanMetrics scanMetrics = scannerContext.getMetrics();
299-
if (scannerInitMetrics != null) {
300-
scannerInitMetrics.getMetricsMap().forEach(scanMetrics::addToCounter);
301-
scannerInitMetrics = null;
302-
}
303-
}
304282
if (outResults.isEmpty()) {
305283
// Usually outResults is empty. This is true when next is called
306284
// to handle scan or get operation.
@@ -310,10 +288,6 @@ public boolean nextRaw(List<? super ExtendedCell> outResults, ScannerContext sca
310288
moreValues = nextInternal(tmpList, scannerContext);
311289
outResults.addAll(tmpList);
312290
}
313-
if (isScanMetricsEnabled) {
314-
ServerSideScanMetrics scanMetrics = scannerContext.getMetrics();
315-
ThreadLocalServerSideScanMetrics.populateServerSideScanMetrics(scanMetrics);
316-
}
317291
region.addReadRequestsCount(1);
318292
if (region.getMetrics() != null) {
319293
region.getMetrics().updateReadRequestCount();

hbase-server/src/test/java/org/apache/hadoop/hbase/namequeues/TestNamedQueueRecorder.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -919,16 +919,6 @@ public long getResponseExceptionSize() {
919919
@Override
920920
public void incrementResponseExceptionSize(long exceptionSize) {
921921
}
922-
923-
@Override
924-
public void updateFsReadTime(long latencyMillis) {
925-
926-
}
927-
928-
@Override
929-
public long getFsReadTime() {
930-
return 0;
931-
}
932922
};
933923
return rpcCall;
934924
}

hbase-server/src/test/java/org/apache/hadoop/hbase/namequeues/TestRpcLogDetails.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -264,16 +264,6 @@ public long getResponseExceptionSize() {
264264
@Override
265265
public void incrementResponseExceptionSize(long exceptionSize) {
266266
}
267-
268-
@Override
269-
public void updateFsReadTime(long latencyMillis) {
270-
271-
}
272-
273-
@Override
274-
public long getFsReadTime() {
275-
return 0;
276-
}
277267
};
278268
return rpcCall;
279269
}

hbase-server/src/test/java/org/apache/hadoop/hbase/procedure2/store/region/TestRegionProcedureStore.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -326,16 +326,6 @@ public long getResponseExceptionSize() {
326326
@Override
327327
public void incrementResponseExceptionSize(long exceptionSize) {
328328
}
329-
330-
@Override
331-
public void updateFsReadTime(long latencyMillis) {
332-
333-
}
334-
335-
@Override
336-
public long getFsReadTime() {
337-
return 0;
338-
}
339329
};
340330
}
341331
}

0 commit comments

Comments
 (0)