View Javadoc

1   /*
2    *
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *     http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
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.CoordinatedStateManagerFactory;
30  import org.apache.hadoop.hbase.HBaseConfiguration;
31  import org.apache.hadoop.hbase.HConstants;
32  import org.apache.hadoop.hbase.HRegionInfo;
33  import org.apache.hadoop.hbase.testclassification.MediumTests;
34  import org.apache.hadoop.hbase.CoordinatedStateManager;
35  import org.apache.hadoop.hbase.ipc.PriorityFunction;
36  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Get;
37  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest;
38  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;
39  import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;
40  import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;
41  import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;
42  import org.junit.Before;
43  import org.junit.Test;
44  import org.junit.experimental.categories.Category;
45  import org.mockito.Mockito;
46  
47  import com.google.protobuf.ByteString;
48  
49  /**
50   * Tests that verify certain RPCs get a higher QoS.
51   */
52  @Category(MediumTests.class)
53  public class TestPriorityRpc {
54    private HRegionServer regionServer = null;
55    private PriorityFunction priority = null;
56  
57    @Before
58    public void setup() {
59      Configuration conf = HBaseConfiguration.create();
60      conf.setBoolean("hbase.testing.nocluster", true); // No need to do ZK
61      CoordinatedStateManager cp = CoordinatedStateManagerFactory.getCoordinatedStateManager(conf);
62      regionServer = HRegionServer.constructRegionServer(HRegionServer.class, conf, cp);
63      priority = regionServer.rpcServices.getPriority();
64    }
65  
66    @Test
67    public void testQosFunctionForMeta() throws IOException {
68      priority = regionServer.rpcServices.getPriority();
69      RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
70      //create a rpc request that has references to hbase:meta region and also
71      //uses one of the known argument classes (known argument classes are
72      //listed in HRegionServer.QosFunctionImpl.knownArgumentClasses)
73      headerBuilder.setMethodName("foo");
74  
75      GetRequest.Builder getRequestBuilder = GetRequest.newBuilder();
76      RegionSpecifier.Builder regionSpecifierBuilder = RegionSpecifier.newBuilder();
77      regionSpecifierBuilder.setType(RegionSpecifierType.REGION_NAME);
78      ByteString name = ByteStringer.wrap(HRegionInfo.FIRST_META_REGIONINFO.getRegionName());
79      regionSpecifierBuilder.setValue(name);
80      RegionSpecifier regionSpecifier = regionSpecifierBuilder.build();
81      getRequestBuilder.setRegion(regionSpecifier);
82      Get.Builder getBuilder = Get.newBuilder();
83      getBuilder.setRow(ByteStringer.wrap("somerow".getBytes()));
84      getRequestBuilder.setGet(getBuilder.build());
85      GetRequest getRequest = getRequestBuilder.build();
86      RequestHeader header = headerBuilder.build();
87      HRegion mockRegion = Mockito.mock(HRegion.class);
88      HRegionServer mockRS = Mockito.mock(HRegionServer.class);
89      RSRpcServices mockRpc = Mockito.mock(RSRpcServices.class);
90      Mockito.when(mockRS.getRSRpcServices()).thenReturn(mockRpc);
91      HRegionInfo mockRegionInfo = Mockito.mock(HRegionInfo.class);
92      Mockito.when(mockRpc.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
93      Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
94      Mockito.when(mockRegionInfo.isSystemTable()).thenReturn(true);
95      // Presume type.
96      ((AnnotationReadingPriorityFunction)priority).setRegionServer(mockRS);
97      assertEquals(HConstants.SYSTEMTABLE_QOS, priority.getPriority(header, getRequest));
98    }
99  
100   @Test
101   public void testQosFunctionWithoutKnownArgument() throws IOException {
102     //The request is not using any of the
103     //known argument classes (it uses one random request class)
104     //(known argument classes are listed in
105     //HRegionServer.QosFunctionImpl.knownArgumentClasses)
106     RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
107     headerBuilder.setMethodName("foo");
108     RequestHeader header = headerBuilder.build();
109     PriorityFunction qosFunc = regionServer.rpcServices.getPriority();
110     assertEquals(HConstants.NORMAL_QOS, qosFunc.getPriority(header, null));
111   }
112 
113   @Test
114   public void testQosFunctionForScanMethod() throws IOException {
115     RequestHeader.Builder headerBuilder = RequestHeader.newBuilder();
116     headerBuilder.setMethodName("Scan");
117     RequestHeader header = headerBuilder.build();
118 
119     //build an empty scan request
120     ScanRequest.Builder scanBuilder = ScanRequest.newBuilder();
121     ScanRequest scanRequest = scanBuilder.build();
122     HRegion mockRegion = Mockito.mock(HRegion.class);
123     HRegionServer mockRS = Mockito.mock(HRegionServer.class);
124     RSRpcServices mockRpc = Mockito.mock(RSRpcServices.class);
125     Mockito.when(mockRS.getRSRpcServices()).thenReturn(mockRpc);
126     HRegionInfo mockRegionInfo = Mockito.mock(HRegionInfo.class);
127     Mockito.when(mockRpc.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
128     Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
129     Mockito.when(mockRegionInfo.isSystemTable()).thenReturn(false);
130     // Presume type.
131     ((AnnotationReadingPriorityFunction)priority).setRegionServer(mockRS);
132     int qos = priority.getPriority(header, scanRequest);
133     assertTrue ("" + qos, qos == HConstants.NORMAL_QOS);
134 
135     //build a scan request with scannerID
136     scanBuilder = ScanRequest.newBuilder();
137     scanBuilder.setScannerId(12345);
138     scanRequest = scanBuilder.build();
139     //mock out a high priority type handling and see the QoS returned
140     RegionScanner mockRegionScanner = Mockito.mock(RegionScanner.class);
141     Mockito.when(mockRpc.getScanner(12345)).thenReturn(mockRegionScanner);
142     Mockito.when(mockRegionScanner.getRegionInfo()).thenReturn(mockRegionInfo);
143     Mockito.when(mockRpc.getRegion((RegionSpecifier)Mockito.any())).thenReturn(mockRegion);
144     Mockito.when(mockRegion.getRegionInfo()).thenReturn(mockRegionInfo);
145     Mockito.when(mockRegionInfo.isSystemTable()).thenReturn(true);
146 
147     // Presume type.
148     ((AnnotationReadingPriorityFunction)priority).setRegionServer(mockRS);
149 
150     assertEquals(HConstants.SYSTEMTABLE_QOS, priority.getPriority(header, scanRequest));
151 
152     //the same as above but with non-meta region
153     Mockito.when(mockRegionInfo.isSystemTable()).thenReturn(false);
154     assertEquals(HConstants.NORMAL_QOS, priority.getPriority(header, scanRequest));
155   }
156 }