From ce926fb9214d81df4d797c33cda32f87225c5f18 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 6 Nov 2015 19:44:04 +0530 Subject: [PATCH] HBASE-14771:RpcServer.getRemoteAddress always returns null Change-Id: I890984554f41bd801d0dddbd1d8fe8b8ed57e71b --- .../org/apache/hadoop/hbase/ipc/RpcServer.java | 2 +- .../apache/hadoop/hbase/ipc/AbstractTestIPC.java | 48 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java index e61d60a..b805ad7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java @@ -1882,7 +1882,7 @@ public class RpcServer implements RpcServerInterface, ConfigurationObserver { ? new TraceInfo(header.getTraceInfo().getTraceId(), header.getTraceInfo().getParentId()) : null; Call call = new Call(id, this.service, md, header, param, cellScanner, this, responder, - totalRequestSize, traceInfo, RpcServer.getRemoteIp()); + totalRequestSize, traceInfo, this.addr); scheduler.dispatch(new CallRunner(RpcServer.this, call)); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestIPC.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestIPC.java index dffd8e9..e5192b8 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestIPC.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestIPC.java @@ -282,4 +282,52 @@ public abstract class AbstractTestIPC { verify(scheduler).stop(); } } + + /** + * Tests that the RpcServer creates & dispatches CallRunner object to scheduler with non-null + * remoteAddress set to its Call Object + */ + @Test + public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException, + InterruptedException { + // TestScheduler sets boolean to true if remoteAddress is set in Call object by RpcServer + class TestScheduler extends FifoRpcScheduler { + private boolean hasRemoteAddress = false; + + public TestScheduler(Configuration conf, int handlerCount) { + super(conf, handlerCount); + } + + @Override + public void dispatch(CallRunner task) throws IOException, InterruptedException { + hasRemoteAddress = task.getCall().getRemoteAddress() != null; + super.dispatch(task); + } + + public boolean hasRemoteAddress() { + return hasRemoteAddress; + } + }; + final TestScheduler scheduler = new TestScheduler(CONF, 1); + final TestRpcServer rpcServer = new TestRpcServer(scheduler); + final AbstractRpcClient client = createRpcClient(CONF); + try { + rpcServer.start(); + MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo"); + EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build(); + InetSocketAddress address = rpcServer.getListenerAddress(); + if (address == null) { + throw new IOException("Listener channel is closed"); + } + client + .call( + new PayloadCarryingRpcController(CellUtil.createCellScanner(ImmutableList + . of(CELL))), md, param, md.getOutputType().toProto(), User.getCurrent(), + address, new MetricsConnection.CallStats()); + assertTrue("RemoteAddress should not be null in Call Object", scheduler.hasRemoteAddress()); + } finally { + client.close(); + rpcServer.stop(); + } + } } -- 1.8.4.msysgit.0