View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.apache.hadoop.hbase.regionserver;
19  
20  import org.apache.hadoop.hbase.HConstants;
21  
22  /**
23   * A {@link RegionSplitPolicy} implementation which splits a region
24   * as soon as any of its store files exceeds a maximum configurable
25   * size.
26   */
27  class ConstantSizeRegionSplitPolicy extends RegionSplitPolicy {
28    private long desiredMaxFileSize;
29  
30    @Override
31    void configureForRegion(HRegion region) {
32      super.configureForRegion(region);
33      long maxFileSize = region.getTableDesc().getMaxFileSize();
34  
35      // By default we split region if a file > HConstants.DEFAULT_MAX_FILE_SIZE.
36      if (maxFileSize == HConstants.DEFAULT_MAX_FILE_SIZE) {
37        maxFileSize = getConf().getLong("hbase.hregion.max.filesize",
38          HConstants.DEFAULT_MAX_FILE_SIZE);
39      }
40      this.desiredMaxFileSize = maxFileSize;
41    }
42    
43    @Override
44    boolean shouldSplit() {
45      boolean force = region.shouldForceSplit();
46      boolean foundABigStore = false;
47      
48      for (Store store : region.getStores().values()) {
49        // If any of the stores are unable to split (eg they contain reference files)
50        // then don't split
51        if ((!store.canSplit())) {
52          return false;
53        }
54  
55        // Mark if any store is big enough
56        if (store.getSize() > desiredMaxFileSize) {
57          foundABigStore = true;
58        }
59      }
60  
61      return foundABigStore || force;
62    }
63  
64    long getDesiredMaxFileSize() {
65      return desiredMaxFileSize;
66    }
67  }