Skip to content

Commit a8599a2

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

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
@@ -132,8 +132,4 @@ public interface RpcCall extends RpcCallContext {
132132

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

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
@@ -44,6 +44,7 @@
4444
import org.apache.hadoop.hbase.io.ByteBuffAllocator;
4545
import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
4646
import org.apache.hadoop.hbase.monitoring.TaskMonitor;
47+
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
4748
import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;
4849
import org.apache.hadoop.hbase.namequeues.RpcLogDetails;
4950
import org.apache.hadoop.hbase.regionserver.RSRpcServices;
@@ -447,19 +448,18 @@ public Pair<Message, CellScanner> call(RpcCall call, MonitoredRPCHandler status)
447448
int processingTime = (int) (endTime - startTime);
448449
int qTime = (int) (startTime - receiveTime);
449450
int totalTime = (int) (endTime - receiveTime);
451+
long fsReadTime = ThreadLocalServerSideScanMetrics.getFsReadTimeCounter().get();
450452
if (LOG.isTraceEnabled()) {
451453
LOG.trace(
452454
"{}, response: {}, receiveTime: {}, queueTime: {}, processingTime: {}, "
453455
+ "totalTime: {}, fsReadTime: {}",
454456
CurCall.get().toString(), TextFormat.shortDebugString(result),
455-
CurCall.get().getReceiveTime(), qTime, processingTime, totalTime,
456-
CurCall.get().getFsReadTime());
457+
CurCall.get().getReceiveTime(), qTime, processingTime, totalTime, fsReadTime);
457458
}
458459
// Use the raw request call size for now.
459460
long requestSize = call.getSize();
460461
long responseSize = result.getSerializedSize();
461462
long responseBlockSize = call.getBlockBytesScanned();
462-
long fsReadTime = call.getFsReadTime();
463463
if (call.isClientCellBlockSupported()) {
464464
// Include the payload size in HBaseRpcController
465465
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
@@ -102,7 +102,6 @@ public abstract class ServerCall<T extends ServerRpcConnection> implements RpcCa
102102

103103
private long responseCellSize = 0;
104104
private long responseBlockSize = 0;
105-
private long fsReadTimeMillis = 0;
106105
// cumulative size of serialized exceptions
107106
private long exceptionSize = 0;
108107
private final boolean retryImmediatelySupported;
@@ -610,14 +609,4 @@ public synchronized BufferChain getResponse() {
610609
public synchronized RpcCallback getCallBack() {
611610
return this.rpcCallback;
612611
}
613-
614-
@Override
615-
public void updateFsReadTime(long latencyMillis) {
616-
fsReadTimeMillis += latencyMillis;
617-
}
618-
619-
@Override
620-
public long getFsReadTime() {
621-
return fsReadTimeMillis;
622-
}
623612
}

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
@@ -112,6 +112,7 @@
112112
import org.apache.hadoop.hbase.log.HBaseMarkers;
113113
import org.apache.hadoop.hbase.master.HMaster;
114114
import org.apache.hadoop.hbase.master.MasterRpcServices;
115+
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
115116
import org.apache.hadoop.hbase.namequeues.NamedQueuePayload;
116117
import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;
117118
import org.apache.hadoop.hbase.namequeues.RpcLogDetails;
@@ -3570,10 +3571,6 @@ private void scan(HBaseRpcController controller, ScanRequest request, RegionScan
35703571
// from block size progress before writing into the response
35713572
scanMetrics.setCounter(ServerSideScanMetrics.BLOCK_BYTES_SCANNED_KEY_METRIC_NAME,
35723573
scannerContext.getBlockSizeProgress());
3573-
if (rpcCall != null) {
3574-
scanMetrics.setCounter(ServerSideScanMetrics.FS_READ_TIME_METRIC_NAME,
3575-
rpcCall.getFsReadTime());
3576-
}
35773574
}
35783575
}
35793576
} finally {
@@ -3639,6 +3636,11 @@ public ScanResponse scan(final RpcController controller, final ScanRequest reque
36393636
}
36403637
throw new ServiceException(e);
36413638
}
3639+
boolean trackMetrics = request.hasTrackScanMetrics() && request.getTrackScanMetrics();
3640+
ThreadLocalServerSideScanMetrics.setScanMetricsEnabled(trackMetrics);
3641+
if (trackMetrics) {
3642+
ThreadLocalServerSideScanMetrics.reset();
3643+
}
36423644
requestCount.increment();
36433645
rpcScanRequestCount.increment();
36443646
RegionScannerContext rsx;
@@ -3709,7 +3711,6 @@ public ScanResponse scan(final RpcController controller, final ScanRequest reque
37093711
boolean scannerClosed = false;
37103712
try {
37113713
List<Result> results = new ArrayList<>(Math.min(rows, 512));
3712-
boolean trackMetrics = request.hasTrackScanMetrics() && request.getTrackScanMetrics();
37133714
ServerSideScanMetrics scanMetrics = trackMetrics ? new ServerSideScanMetrics() : null;
37143715
if (rows > 0) {
37153716
boolean done = false;
@@ -3791,6 +3792,7 @@ public ScanResponse scan(final RpcController controller, final ScanRequest reque
37913792
scanMetrics.addToCounter(ServerSideScanMetrics.RPC_SCAN_QUEUE_WAIT_TIME_METRIC_NAME,
37923793
rpcQueueWaitTime);
37933794
}
3795+
ThreadLocalServerSideScanMetrics.populateServerSideScanMetrics(scanMetrics);
37943796
Map<String, Long> metrics = scanMetrics.getMetricsMap();
37953797
ScanMetrics.Builder metricBuilder = ScanMetrics.newBuilder();
37963798
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
@@ -44,7 +44,6 @@
4444
import org.apache.hadoop.hbase.ipc.RpcCall;
4545
import org.apache.hadoop.hbase.ipc.RpcCallback;
4646
import org.apache.hadoop.hbase.ipc.RpcServer;
47-
import org.apache.hadoop.hbase.monitoring.ThreadLocalServerSideScanMetrics;
4847
import org.apache.hadoop.hbase.regionserver.Region.Operation;
4948
import org.apache.hadoop.hbase.regionserver.ScannerContext.LimitScope;
5049
import org.apache.hadoop.hbase.regionserver.ScannerContext.NextState;
@@ -95,8 +94,6 @@ public class RegionScannerImpl implements RegionScanner, Shipper, RpcCallback {
9594

9695
private RegionServerServices rsServices;
9796

98-
private ServerSideScanMetrics scannerInitMetrics = null;
99-
10097
@Override
10198
public RegionInfo getRegionInfo() {
10299
return region.getRegionInfo();
@@ -147,16 +144,7 @@ private static boolean hasNonce(HRegion region, long nonce) {
147144
} finally {
148145
region.smallestReadPointCalcLock.unlock(ReadPointCalculationLock.LockType.RECORDING_LOCK);
149146
}
150-
boolean isScanMetricsEnabled = scan.isScanMetricsEnabled();
151-
ThreadLocalServerSideScanMetrics.setScanMetricsEnabled(isScanMetricsEnabled);
152-
if (isScanMetricsEnabled) {
153-
this.scannerInitMetrics = new ServerSideScanMetrics();
154-
ThreadLocalServerSideScanMetrics.reset();
155-
}
156147
initializeScanners(scan, additionalScanners);
157-
if (isScanMetricsEnabled) {
158-
ThreadLocalServerSideScanMetrics.populateServerSideScanMetrics(scannerInitMetrics);
159-
}
160148
}
161149

162150
public ScannerContext getContext() {
@@ -289,16 +277,6 @@ public boolean nextRaw(List<Cell> outResults, ScannerContext scannerContext) thr
289277
throw new UnknownScannerException("Scanner was closed");
290278
}
291279
boolean moreValues = false;
292-
boolean isScanMetricsEnabled = scannerContext.isTrackingMetrics();
293-
ThreadLocalServerSideScanMetrics.setScanMetricsEnabled(isScanMetricsEnabled);
294-
if (isScanMetricsEnabled) {
295-
ThreadLocalServerSideScanMetrics.reset();
296-
ServerSideScanMetrics scanMetrics = scannerContext.getMetrics();
297-
if (scannerInitMetrics != null) {
298-
scannerInitMetrics.getMetricsMap().forEach(scanMetrics::addToCounter);
299-
scannerInitMetrics = null;
300-
}
301-
}
302280
if (outResults.isEmpty()) {
303281
// Usually outResults is empty. This is true when next is called
304282
// to handle scan or get operation.
@@ -308,10 +286,6 @@ public boolean nextRaw(List<Cell> outResults, ScannerContext scannerContext) thr
308286
moreValues = nextInternal(tmpList, scannerContext);
309287
outResults.addAll(tmpList);
310288
}
311-
if (isScanMetricsEnabled) {
312-
ServerSideScanMetrics scanMetrics = scannerContext.getMetrics();
313-
ThreadLocalServerSideScanMetrics.populateServerSideScanMetrics(scanMetrics);
314-
}
315289
region.addReadRequestsCount(1);
316290
if (region.getMetrics() != null) {
317291
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)