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