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.assertEquals;
23 import static org.junit.Assert.assertTrue;
24
25 import java.io.IOException;
26
27 import org.apache.hadoop.hbase.util.ByteStringer;
28 import org.apache.hadoop.conf.Configuration;
29 import org.apache.hadoop.hbase.HBaseConfiguration;
30 import org.apache.hadoop.hbase.HConstants;
31 import org.apache.hadoop.hbase.HRegionInfo;
32 import org.apache.hadoop.hbase.MediumTests;
33 import org.apache.hadoop.hbase.ipc.PriorityFunction;
34 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Get;
35 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest;
36 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;
37 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;
38 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;
39 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;
40 import org.junit.Before;
41 import org.junit.Test;
42 import org.junit.experimental.categories.Category;
43 import org.mockito.Mockito;
44
45 import com.google.protobuf.ByteString;
46
47
48
49
50 @Category(MediumTests.class)
51 public class TestPriorityRpc {
52 private HRegionServer regionServer = null;
53 private PriorityFunction priority = null;
54
55 @Before
56 public void setup() {
57 Configuration conf = HBaseConfiguration.create();
58 regionServer = HRegionServer.constructRegionServer(HRegionServer.class, conf);
59 priority = regionServer.getPriority();
60 }
61
62 @Test
63 public void testQosFunctionForMeta() throws IOException {
64 priority = regionServer.getPriority();
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 = ByteStringer.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(ByteStringer.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
90 ((AnnotationReadingPriorityFunction)priority).setRegionServer(mockRS);
91 assertEquals(HConstants.HIGH_QOS, priority.getPriority(header, getRequest));
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 PriorityFunction qosFunc = regionServer.getPriority();
104 assertEquals(HConstants.NORMAL_QOS, qosFunc.getPriority(header, null));
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
123 ((AnnotationReadingPriorityFunction)priority).setRegionServer(mockRS);
124 int qos = priority.getPriority(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
140 ((AnnotationReadingPriorityFunction)priority).setRegionServer(mockRS);
141
142 assertEquals(HConstants.HIGH_QOS, priority.getPriority(header, scanRequest));
143
144
145 Mockito.when(mockRegionInfo.isMetaRegion()).thenReturn(false);
146 assertEquals(HConstants.NORMAL_QOS, priority.getPriority(header, scanRequest));
147 }
148 }