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;
19  
20  import com.google.common.collect.Sets;
21  import org.apache.hadoop.conf.Configuration;
22  import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy;
23  import org.apache.hadoop.hbase.testclassification.IntegrationTests;
24  import org.apache.hadoop.hbase.util.Bytes;
25  import org.apache.hadoop.util.ToolRunner;
26  import org.junit.Test;
27  import org.junit.experimental.categories.Category;
28  
29  import java.util.Set;
30  
31  /**
32   * This Integration Test verifies acid guarantees across column families by frequently writing
33   * values to rows with multiple column families and concurrently reading entire rows that expect all
34   * column families.
35   *
36   * <p>
37   * Sample usage:
38   * <pre>
39   * hbase org.apache.hadoop.hbase.IntegrationTestAcidGuarantees -Dmillis=10000 -DnumWriters=50
40   * -DnumGetters=2 -DnumScanners=2 -DnumUniqueRows=5
41   * </pre>
42   */
43  @Category(IntegrationTests.class)
44  public class IntegrationTestAcidGuarantees extends IntegrationTestBase {
45    private static final int SERVER_COUNT = 1; // number of slaves for the smallest cluster
46  
47    // The unit test version.
48    TestAcidGuarantees tag;
49  
50    @Override
51    public int runTestFromCommandLine() throws Exception {
52      Configuration c = getConf();
53      int millis = c.getInt("millis", 5000);
54      int numWriters = c.getInt("numWriters", 50);
55      int numGetters = c.getInt("numGetters", 2);
56      int numScanners = c.getInt("numScanners", 2);
57      int numUniqueRows = c.getInt("numUniqueRows", 3);
58      tag.runTestAtomicity(millis, numWriters, numGetters, numScanners, numUniqueRows, true);
59      return 0;
60    }
61  
62    @Override
63    public void setUpCluster() throws Exception {
64      // Set small flush size for minicluster so we exercise reseeking scanners
65      util = getTestingUtil(getConf());
66      util.initializeCluster(SERVER_COUNT);
67      conf = getConf();
68      conf.set(HConstants.HREGION_MEMSTORE_FLUSH_SIZE, String.valueOf(128*1024));
69      // prevent aggressive region split
70      conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY,
71              ConstantSizeRegionSplitPolicy.class.getName());
72      this.setConf(util.getConfiguration());
73  
74      // replace the HBaseTestingUtility in the unit test with the integration test's
75      // IntegrationTestingUtility
76      tag = new TestAcidGuarantees();
77      tag.setHBaseTestingUtil(util);
78    }
79  
80    @Override
81    public TableName getTablename() {
82      return TestAcidGuarantees.TABLE_NAME;
83    }
84  
85    @Override
86    protected Set<String> getColumnFamilies() {
87      return Sets.newHashSet(Bytes.toString(TestAcidGuarantees.FAMILY_A),
88              Bytes.toString(TestAcidGuarantees.FAMILY_B),
89              Bytes.toString(TestAcidGuarantees.FAMILY_C));
90    }
91  
92    // ***** Actual integration tests
93  
94    @Test
95    public void testGetAtomicity() throws Exception {
96      tag.runTestAtomicity(20000, 4, 4, 0, 3);
97    }
98  
99    @Test
100   public void testScanAtomicity() throws Exception {
101     tag.runTestAtomicity(20000, 3, 0, 2, 3);
102   }
103 
104   @Test
105   public void testMixedAtomicity() throws Exception {
106     tag.runTestAtomicity(20000, 4, 2, 2, 3);
107   }
108 
109 
110   // **** Command line hook
111 
112   public static void main(String[] args) throws Exception {
113     Configuration conf = HBaseConfiguration.create();
114     IntegrationTestingUtility.setUseDistributedCluster(conf);
115     int ret = ToolRunner.run(conf, new IntegrationTestAcidGuarantees(), args);
116     System.exit(ret);
117   }
118 }