Skip to content

Commit

Permalink
HBASE-14674 Rpc handler / task monitoring seems to be broken after 0.…
Browse files Browse the repository at this point in the history
…98 (Heng Chen)
  • Loading branch information
enis committed Oct 27, 2015
1 parent dfa0528 commit d5d81d6
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.ipc.RpcServer.Call;
import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
import org.apache.hadoop.hbase.monitoring.TaskMonitor;
import org.apache.hadoop.hbase.util.Pair;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.util.StringUtils;
Expand Down Expand Up @@ -59,20 +58,22 @@ public class CallRunner {
this.rpcServer = rpcServer;
// Add size of the call to queue size.
this.rpcServer.addCallSize(call.getSize());
this.status = getStatus();
}

public Call getCall() {
return call;
}

public void setStatus(MonitoredRPCHandler status) {
this.status = status;
}

/**
* Cleanup after ourselves... let go of references.
*/
private void cleanup() {
this.call = null;
this.rpcServer = null;
this.status = null;
}

public void run() {
Expand Down Expand Up @@ -160,16 +161,4 @@ public void run() {
cleanup();
}
}

MonitoredRPCHandler getStatus() {
// It is ugly the way we park status up in RpcServer. Let it be for now. TODO.
MonitoredRPCHandler status = RpcServer.MONITORED_RPC.get();
if (status != null) {
return status;
}
status = TaskMonitor.get().createRPCStatus(Thread.currentThread().getName());
status.pause("Waiting for a call");
RpcServer.MONITORED_RPC.set(status);
return status;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.hadoop.hbase.ipc.CallRunner;

/**
* A very simple {@code }RpcScheduler} that serves incoming requests in order.
Expand Down Expand Up @@ -70,6 +69,7 @@ public void dispatch(final CallRunner task) throws IOException, InterruptedExcep
executor.submit(new Runnable() {
@Override
public void run() {
task.setStatus(RpcServer.getStatus());
task.run();
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.classification.InterfaceStability;
import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
import org.apache.hadoop.util.StringUtils;

import com.google.common.base.Preconditions;
Expand Down Expand Up @@ -124,7 +125,9 @@ protected void consumerLoop(final BlockingQueue<CallRunner> myQueue) {
try {
while (running) {
try {
MonitoredRPCHandler status = RpcServer.getStatus();
CallRunner task = myQueue.take();
task.setStatus(status);
try {
activeHandlerCount.incrementAndGet();
task.run();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
import org.apache.hadoop.hbase.io.ByteBufferOutputStream;
import org.apache.hadoop.hbase.io.BoundedByteBufferPool;
import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
import org.apache.hadoop.hbase.monitoring.TaskMonitor;
import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;
import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;
Expand Down Expand Up @@ -2314,7 +2315,8 @@ public void addCallSize(final long diff) {
* @param user client user
* @param connection incoming connection
* @param addr InetAddress of incoming connection
* @throws org.apache.hadoop.security.authorize.AuthorizationException when the client isn't authorized to talk the protocol
* @throws org.apache.hadoop.security.authorize.AuthorizationException
* when the client isn't authorized to talk the protocol
*/
public void authorize(UserGroupInformation user, ConnectionHeader connection, InetAddress addr)
throws AuthorizationException {
Expand Down Expand Up @@ -2498,6 +2500,18 @@ static BlockingService getService(
return bsasi == null? null: bsasi.getBlockingService();
}

static MonitoredRPCHandler getStatus() {
// It is ugly the way we park status up in RpcServer. Let it be for now. TODO.
MonitoredRPCHandler status = RpcServer.MONITORED_RPC.get();
if (status != null) {
return status;
}
status = TaskMonitor.get().createRPCStatus(Thread.currentThread().getName());
status.pause("Waiting for a call");
RpcServer.MONITORED_RPC.set(status);
return status;
}

/** Returns the remote side ip address when invoked inside an RPC
* Returns null incase of an error.
* @return InetAddress
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package org.apache.hadoop.hbase.ipc;

import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl;
import org.apache.hadoop.hbase.testclassification.RPCTests;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
Expand All @@ -35,6 +36,7 @@ public void testSimpleCall() {
RpcServer.Call mockCall = Mockito.mock(RpcServer.Call.class);
mockCall.connection = Mockito.mock(RpcServer.Connection.class);
CallRunner cr = new CallRunner(mockRpcServer, mockCall);
cr.setStatus(new MonitoredRPCHandlerImpl());
cr.run();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl;
import org.apache.hadoop.hbase.security.User;
import org.apache.hadoop.hbase.testclassification.RPCTests;
import org.apache.hadoop.hbase.testclassification.SmallTests;
Expand Down Expand Up @@ -87,6 +88,7 @@ public void testBasic() throws IOException, InterruptedException {
scheduler.init(CONTEXT);
scheduler.start();
CallRunner task = createMockTask();
task.setStatus(new MonitoredRPCHandlerImpl());
scheduler.dispatch(task);
verify(task, timeout(1000)).run();
scheduler.stop();
Expand Down Expand Up @@ -121,6 +123,7 @@ public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
}
};
for (CallRunner task : tasks) {
task.setStatus(new MonitoredRPCHandlerImpl());
doAnswer(answerToRun).when(task).run();
}

Expand Down Expand Up @@ -303,6 +306,7 @@ public void testScanQueues() throws Exception {

private void doAnswerTaskExecution(final CallRunner callTask,
final ArrayList<Integer> results, final int value, final int sleepInterval) {
callTask.setStatus(new MonitoredRPCHandlerImpl());
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) {
Expand Down

0 comments on commit d5d81d6

Please sign in to comment.