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
46
47
48 @Category(MediumTests.class)
49 public class TestPriorityRpc {
50 private HRegionServer regionServer = null;
51 private QosFunction qosFunction = null;
52
53 @Before
54 public void setup() {
55 Configuration conf = HBaseConfiguration.create();
56 regionServer = HRegionServer.constructRegionServer(HRegionServer.class, conf);
57 qosFunction = regionServer.getQosFunction();
58 }
59
60 @Test
61 public void testQosFunctionForMeta() throws IOException {
62 qosFunction = regionServer.getQosFunction();
63 RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
64
65
66
67 headerBuilder.setMethodName("foo");
68
69 GetRequest.Builder getRequestBuilder = GetRequest.newBuilder();
70 RegionSpecifier.Builder regionSpecifierBuilder = RegionSpecifier.newBuilder();
71 regionSpecifierBuilder.setType(RegionSpecifierType.REGION_NAME);
72 ByteString name = ByteString.copyFrom(HRegionInfo.FIRST_META_REGIONINFO.getRegionName());
73 regionSpecifierBuilder.setValue(name);
74 RegionSpecifier regionSpecifier = regionSpecifierBuilder.build();
75 getRequestBuilder.setRegion(regionSpecifier);
76 Get.Builder getBuilder = Get.newBuilder();
77 getBuilder.setRow(ByteString.copyFrom("somerow".getBytes()));
78 getRequestBuilder.setGet(getBuilder.build());
79 GetRequest getRequest = getRequestBuilder.build();
80 RequestHeader header = headerBuilder.build();
81 HRegion mockRegion = Mockito.mock(HRegion.class);
82 HRegionServer mockRS = Mockito.mock(HRegionServer.class);
83 HRegionInfo mockRegionInfo = Mockito.mock(HRegionInfo.class);
84 Mockito.when(mockRS.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
85 Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
86 Mockito.when(mockRegionInfo.isMetaTable()).thenReturn(true);
87 qosFunction.setRegionServer(mockRS);
88 assertTrue (qosFunction.apply(new Pair<RequestHeader, Message>(header, getRequest)) ==
89 HConstants.HIGH_QOS);
90 }
91
92 @Test
93 public void testQosFunctionWithoutKnownArgument() throws IOException {
94
95
96
97
98 RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
99 headerBuilder.setMethodName("foo");
100 RequestHeader header = headerBuilder.build();
101 QosFunction qosFunc = regionServer.getQosFunction();
102 assertTrue (qosFunc.apply(new Pair<RequestHeader, Message>(header, null)) ==
103 HConstants.NORMAL_QOS);
104 }
105
106 @Test
107 public void testQosFunctionForScanMethod() throws IOException {
108 RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
109 headerBuilder.setMethodName("scan");
110 RequestHeader header = headerBuilder.build();
111
112
113 ScanRequest.Builder scanBuilder = ScanRequest.newBuilder();
114 ScanRequest scanRequest = scanBuilder.build();
115 HRegion mockRegion = Mockito.mock(HRegion.class);
116 HRegionServer mockRS = Mockito.mock(HRegionServer.class);
117 HRegionInfo mockRegionInfo = Mockito.mock(HRegionInfo.class);
118 Mockito.when(mockRS.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
119 Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
120 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(false);
121 qosFunction.setRegionServer(mockRS);
122 int qos = qosFunction.apply(new Pair<RequestHeader, Message>(header, scanRequest));
123 assertTrue ("" + qos, qos == HConstants.NORMAL_QOS);
124
125
126 scanBuilder = ScanRequest.newBuilder();
127 scanBuilder.setScannerId(12345);
128 scanRequest = scanBuilder.build();
129
130 RegionScanner mockRegionScanner = Mockito.mock(RegionScanner.class);
131 Mockito.when(mockRS.getScanner(12345)).thenReturn(mockRegionScanner);
132 Mockito.when(mockRegionScanner.getRegionInfo()).thenReturn(mockRegionInfo);
133 Mockito.when(mockRS.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
134 Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
135 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(true);
136
137 qosFunction.setRegionServer(mockRS);
138
139 assertTrue (qosFunction.apply(new Pair<RequestHeader, Message>(header, scanRequest)) ==
140 HConstants.HIGH_QOS);
141
142
143 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(false);
144 assertTrue (qosFunction.apply(new Pair<RequestHeader, Message>(header, scanRequest)) ==
145 HConstants.NORMAL_QOS);
146 }
147 }