1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.ipc;
19
20 import static org.apache.hadoop.hbase.ipc.AbstractTestIPC.SERVICE;
21 import static org.junit.Assert.assertEquals;
22
23 import java.io.BufferedInputStream;
24 import java.io.DataInputStream;
25 import java.io.DataOutputStream;
26 import java.io.IOException;
27 import java.net.InetSocketAddress;
28 import java.net.Socket;
29
30 import org.apache.hadoop.conf.Configuration;
31 import org.apache.hadoop.hbase.HBaseConfiguration;
32 import org.apache.hadoop.hbase.HConstants;
33 import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;
34 import org.apache.hadoop.hbase.ipc.protobuf.generated.TestProtos.EmptyRequestProto;
35 import org.apache.hadoop.hbase.ipc.protobuf.generated.TestProtos.EmptyResponseProto;
36 import org.apache.hadoop.hbase.ipc.protobuf.generated.TestRpcServiceProtos;
37 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
38 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;
39 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;
40 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;
41 import org.apache.hadoop.hbase.security.AuthMethod;
42 import org.apache.hadoop.hbase.testclassification.MediumTests;
43 import org.apache.hadoop.hbase.testclassification.RPCTests;
44 import org.junit.After;
45 import org.junit.Before;
46 import org.junit.Test;
47 import org.junit.experimental.categories.Category;
48
49 import com.google.common.collect.Lists;
50
51 @Category({ RPCTests.class, MediumTests.class })
52 public class TestRpcServerSlowConnectionSetup {
53
54 private RpcServer server;
55
56 private Socket socket;
57
58 @Before
59 public void setUp() throws IOException {
60 Configuration conf = HBaseConfiguration.create();
61 server = new RpcServer(null, "testRpcServer",
62 Lists.newArrayList(new BlockingServiceAndInterface(SERVICE, null)),
63 new InetSocketAddress("localhost", 0), conf, new FifoRpcScheduler(conf, 1));
64 server.start();
65 socket = new Socket("localhost", server.getListenerAddress().getPort());
66 }
67
68 @After
69 public void tearDown() throws IOException {
70 if (socket != null) {
71 socket.close();
72 }
73 if (server != null) {
74 server.stop();
75 }
76 }
77
78 @Test
79 public void test() throws IOException, InterruptedException {
80 int rpcHeaderLen = HConstants.RPC_HEADER.length;
81 byte[] preamble = new byte[rpcHeaderLen + 2];
82 System.arraycopy(HConstants.RPC_HEADER, 0, preamble, 0, rpcHeaderLen);
83 preamble[rpcHeaderLen] = HConstants.RPC_CURRENT_VERSION;
84 preamble[rpcHeaderLen + 1] = AuthMethod.SIMPLE.code;
85 socket.getOutputStream().write(preamble, 0, rpcHeaderLen + 1);
86 socket.getOutputStream().flush();
87 Thread.sleep(5000);
88 socket.getOutputStream().write(preamble, rpcHeaderLen + 1, 1);
89 socket.getOutputStream().flush();
90
91 ConnectionHeader header = ConnectionHeader.newBuilder()
92 .setServiceName(TestRpcServiceProtos.TestProtobufRpcProto.getDescriptor().getFullName())
93 .setVersionInfo(ProtobufUtil.getVersionInfo()).build();
94 DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
95 dos.writeInt(header.getSerializedSize());
96 header.writeTo(dos);
97 dos.flush();
98
99 int callId = 10;
100 RequestHeader requestHeader = RequestHeader.newBuilder().setCallId(callId).setMethodName("ping")
101 .setRequestParam(true).setTimeout(1000).build();
102 dos.writeInt(IPCUtil.getTotalSizeWhenWrittenDelimited(requestHeader,
103 EmptyRequestProto.getDefaultInstance()));
104 requestHeader.writeDelimitedTo(dos);
105 EmptyRequestProto.getDefaultInstance().writeDelimitedTo(dos);
106 dos.flush();
107
108 DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
109 int size = dis.readInt();
110 ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(dis);
111 assertEquals(callId, responseHeader.getCallId());
112 EmptyResponseProto.Builder builder = EmptyResponseProto.newBuilder();
113 builder.mergeDelimitedFrom(dis);
114 assertEquals(size, IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader, builder.build()));
115 }
116 }