HADOOP-16700. Track response time separately in Server.Call to avoid negative RpcQueueTime values. Contributed by xuzq.

(cherry picked from be77231452baee2c3dd68f7c0991411cae2eea1b)
(cherry picked from c1ed2474595c672d95237c42a6e2a51913f14d25)
(cherry picked from 23f25418e822f90aa6bd0daa0ba65ab548b05eb1)
This commit is contained in:
Erik Krogen 2019-11-20 07:56:33 -08:00 committed by Erik Krogen
parent e7ecb4f51f
commit 0ac6dc79b0

View File

@ -738,8 +738,8 @@ public static class Call implements Schedulable,
private volatile String detailedMetricsName = ""; private volatile String detailedMetricsName = "";
final int callId; // the client's call id final int callId; // the client's call id
final int retryCount; // the retry count of the call final int retryCount; // the retry count of the call
long timestampNanos; // time received when response is null long timestampNanos; // time the call was received
// time served when response is not null long responseTimestampNanos; // time the call was served
private AtomicInteger responseWaitCount = new AtomicInteger(1); private AtomicInteger responseWaitCount = new AtomicInteger(1);
final RPC.RpcKind rpcKind; final RPC.RpcKind rpcKind;
final byte[] clientId; final byte[] clientId;
@ -776,6 +776,7 @@ public Call(int id, int retryCount, Void ignore1, Void ignore2,
this.callId = id; this.callId = id;
this.retryCount = retryCount; this.retryCount = retryCount;
this.timestampNanos = Time.monotonicNowNanos(); this.timestampNanos = Time.monotonicNowNanos();
this.responseTimestampNanos = timestampNanos;
this.rpcKind = kind; this.rpcKind = kind;
this.clientId = clientId; this.clientId = clientId;
this.traceScope = traceScope; this.traceScope = traceScope;
@ -1574,7 +1575,7 @@ private void doPurge(RpcCall call, long now) {
Iterator<RpcCall> iter = responseQueue.listIterator(0); Iterator<RpcCall> iter = responseQueue.listIterator(0);
while (iter.hasNext()) { while (iter.hasNext()) {
call = iter.next(); call = iter.next();
if (now > call.timestampNanos + PURGE_INTERVAL_NANOS) { if (now > call.responseTimestampNanos + PURGE_INTERVAL_NANOS) {
closeConnection(call.connection); closeConnection(call.connection);
break; break;
} }
@ -1638,7 +1639,7 @@ private boolean processResponse(LinkedList<RpcCall> responseQueue,
if (inHandler) { if (inHandler) {
// set the serve time when the response has to be sent later // set the serve time when the response has to be sent later
call.timestampNanos = Time.monotonicNowNanos(); call.responseTimestampNanos = Time.monotonicNowNanos();
incPending(); incPending();
try { try {