1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.regionserver;
21
22 import static org.junit.Assert.*;
23
24 import java.io.IOException;
25
26 import org.apache.hadoop.conf.Configuration;
27 import org.apache.hadoop.hbase.HBaseConfiguration;
28 import org.apache.hadoop.hbase.HConstants;
29 import org.apache.hadoop.hbase.HRegionInfo;
30 import org.apache.hadoop.hbase.MediumTests;
31 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Get;
32 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest;
33 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;
34 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;
35 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;
36 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;
37 import org.apache.hadoop.hbase.util.Pair;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.experimental.categories.Category;
41 import org.mockito.Mockito;
42
43 import com.google.protobuf.ByteString;
44 import com.google.protobuf.Message;
45 import com.google.protobuf.ZeroCopyLiteralByteString;
46
47
48
49 @Category(MediumTests.class)
50 public class TestPriorityRpc {
51 private HRegionServer regionServer = null;
52 private QosFunction qosFunction = null;
53
54 @Before
55 public void setup() {
56 Configuration conf = HBaseConfiguration.create();
57 regionServer = HRegionServer.constructRegionServer(HRegionServer.class, conf);
58 qosFunction = regionServer.getQosFunction();
59 }
60
61 @Test
62 public void testQosFunctionForMeta() throws IOException {
63 qosFunction = regionServer.getQosFunction();
64 RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
65
66
67
68 headerBuilder.setMethodName("foo");
69
70 GetRequest.Builder getRequestBuilder = GetRequest.newBuilder();
71 RegionSpecifier.Builder regionSpecifierBuilder = RegionSpecifier.newBuilder();
72 regionSpecifierBuilder.setType(RegionSpecifierType.REGION_NAME);
73 ByteString name = ZeroCopyLiteralByteString.wrap(HRegionInfo.FIRST_META_REGIONINFO.getRegionName());
74 regionSpecifierBuilder.setValue(name);
75 RegionSpecifier regionSpecifier = regionSpecifierBuilder.build();
76 getRequestBuilder.setRegion(regionSpecifier);
77 Get.Builder getBuilder = Get.newBuilder();
78 getBuilder.setRow(ZeroCopyLiteralByteString.wrap("somerow".getBytes()));
79 getRequestBuilder.setGet(getBuilder.build());
80 GetRequest getRequest = getRequestBuilder.build();
81 RequestHeader header = headerBuilder.build();
82 HRegion mockRegion = Mockito.mock(HRegion.class);
83 HRegionServer mockRS = Mockito.mock(HRegionServer.class);
84 HRegionInfo mockRegionInfo = Mockito.mock(HRegionInfo.class);
85 Mockito.when(mockRS.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
86 Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
87 Mockito.when(mockRegionInfo.isMetaTable()).thenReturn(true);
88 qosFunction.setRegionServer(mockRS);
89 assertTrue (qosFunction.apply(new Pair<RequestHeader, Message>(header, getRequest)) ==
90 HConstants.HIGH_QOS);
91 }
92
93 @Test
94 public void testQosFunctionWithoutKnownArgument() throws IOException {
95
96
97
98
99 RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
100 headerBuilder.setMethodName("foo");
101 RequestHeader header = headerBuilder.build();
102 QosFunction qosFunc = regionServer.getQosFunction();
103 assertTrue (qosFunc.apply(new Pair<RequestHeader, Message>(header, null)) ==
104 HConstants.NORMAL_QOS);
105 }
106
107 @Test
108 public void testQosFunctionForScanMethod() throws IOException {
109 RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
110 headerBuilder.setMethodName("scan");
111 RequestHeader header = headerBuilder.build();
112
113
114 ScanRequest.Builder scanBuilder = ScanRequest.newBuilder();
115 ScanRequest scanRequest = scanBuilder.build();
116 HRegion mockRegion = Mockito.mock(HRegion.class);
117 HRegionServer mockRS = Mockito.mock(HRegionServer.class);
118 HRegionInfo mockRegionInfo = Mockito.mock(HRegionInfo.class);
119 Mockito.when(mockRS.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
120 Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
121 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(false);
122 qosFunction.setRegionServer(mockRS);
123 int qos = qosFunction.apply(new Pair<RequestHeader, Message>(header, scanRequest));
124 assertTrue ("" + qos, qos == HConstants.NORMAL_QOS);
125
126
127 scanBuilder = ScanRequest.newBuilder();
128 scanBuilder.setScannerId(12345);
129 scanRequest = scanBuilder.build();
130
131 RegionScanner mockRegionScanner = Mockito.mock(RegionScanner.class);
132 Mockito.when(mockRS.getScanner(12345)).thenReturn(mockRegionScanner);
133 Mockito.when(mockRegionScanner.getRegionInfo()).thenReturn(mockRegionInfo);
134 Mockito.when(mockRS.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
135 Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
136 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(true);
137
138 qosFunction.setRegionServer(mockRS);
139
140 assertTrue (qosFunction.apply(new Pair<RequestHeader, Message>(header, scanRequest)) ==
141 HConstants.HIGH_QOS);
142
143
144 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(false);
145 assertTrue (qosFunction.apply(new Pair<RequestHeader, Message>(header, scanRequest)) ==
146 HConstants.NORMAL_QOS);
147 }
148 }