1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.util.hbck;
19
20 import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertErrors;
21 import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.doFsck;
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertTrue;
24
25 import java.util.Arrays;
26 import java.util.List;
27
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.apache.hadoop.hbase.HTableDescriptor;
31 import org.apache.hadoop.hbase.NamespaceDescriptor;
32 import org.apache.hadoop.hbase.TableName;
33 import org.apache.hadoop.hbase.testclassification.MediumTests;
34 import org.apache.hadoop.hbase.client.Admin;
35 import org.apache.hadoop.hbase.client.Connection;
36 import org.apache.hadoop.hbase.client.ConnectionFactory;
37 import org.apache.hadoop.hbase.util.Bytes;
38 import org.apache.hadoop.hbase.util.HBaseFsck;
39 import org.apache.hadoop.hbase.util.HBaseFsck.ErrorReporter.ERROR_CODE;
40 import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;
41 import org.junit.Test;
42 import org.junit.experimental.categories.Category;
43
44
45
46
47 @Category(MediumTests.class)
48 public class TestOfflineMetaRebuildBase extends OfflineMetaRebuildTestCore {
49 private static final Log LOG = LogFactory.getLog(TestOfflineMetaRebuildBase.class);
50
51 @Test(timeout = 120000)
52 public void testMetaRebuild() throws Exception {
53 wipeOutMeta();
54
55
56 assertEquals(1, scanMeta());
57 assertErrors(doFsck(conf, false),
58 new ERROR_CODE[] {
59 ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
60 ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
61 ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
62 ERROR_CODE.NOT_IN_META_OR_DEPLOYED});
63
64
65
66
67 TEST_UTIL.shutdownMiniHBaseCluster();
68 TEST_UTIL.shutdownMiniZKCluster();
69
70
71 HBaseFsck fsck = new HBaseFsck(conf);
72 assertTrue(fsck.rebuildMeta(false));
73
74
75 TEST_UTIL.startMiniZKCluster();
76 TEST_UTIL.restartHBaseCluster(3);
77 validateMetaAndUserTableRows(1, 5);
78 }
79
80 @Test(timeout = 300000)
81 public void testHMasterStartupOnMetaRebuild() throws Exception {
82
83 TEST_UTIL.shutdownMiniHBaseCluster();
84
85
86 TEST_UTIL.getConfiguration().set("hbase.balancer.tablesOnMaster", "hbase:meta");
87
88 TEST_UTIL.getConfiguration().set("hbase.master.namespace.init.timeout", "150000");
89 TEST_UTIL.restartHBaseCluster(3);
90 TEST_UTIL.getMiniHBaseCluster().waitForActiveAndReadyMaster();
91
92 try {
93
94 TEST_UTIL.getHBaseAdmin().createNamespace(NamespaceDescriptor.create("ns1").build());
95 TEST_UTIL.getHBaseAdmin().createNamespace(NamespaceDescriptor.create("ns2").build());
96
97 TEST_UTIL.createTable(TableName.valueOf("ns1:testHMasterStartupOnMetaRebuild"),
98 Bytes.toBytes("cf1"));
99 TEST_UTIL.createTable(TableName.valueOf("ns2:testHMasterStartupOnMetaRebuild"),
100 Bytes.toBytes("cf1"));
101
102
103 TEST_UTIL.flush(TableName.META_TABLE_NAME);
104
105
106 TEST_UTIL.getHBaseCluster().getMaster().shutdown();
107
108
109 List<RegionServerThread> regionServerThreads =
110 TEST_UTIL.getHBaseCluster().getRegionServerThreads();
111 for (RegionServerThread regionServerThread : regionServerThreads) {
112 TEST_UTIL.getHBaseCluster()
113 .killRegionServer(regionServerThread.getRegionServer().getServerName());
114 }
115
116
117 HBaseFsck fsck = new HBaseFsck(conf);
118 assertTrue(fsck.rebuildMeta(false));
119
120
121 TEST_UTIL.restartHBaseCluster(3);
122 validateMetaAndUserTableRows(3, 7);
123 } finally {
124
125 TEST_UTIL.deleteTable("ns1:testHMasterStartupOnMetaRebuild");
126 TEST_UTIL.deleteTable("ns2:testHMasterStartupOnMetaRebuild");
127 TEST_UTIL.getHBaseAdmin().deleteNamespace("ns1");
128 TEST_UTIL.getHBaseAdmin().deleteNamespace("ns2");
129 }
130 }
131
132
133
134
135 private void validateMetaAndUserTableRows(int totalTableCount, int totalRegionCount)
136 throws Exception {
137 try (Connection connection = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {
138 Admin admin = connection.getAdmin();
139 admin.enableTable(table);
140 LOG.info("Waiting for no more RIT");
141 TEST_UTIL.waitUntilNoRegionsInTransition(60000);
142 LOG.info("No more RIT in ZK, now doing final test verification");
143
144
145 assertEquals(totalRegionCount, scanMeta());
146 HTableDescriptor[] htbls = admin.listTables();
147 LOG.info("Tables present after restart: " + Arrays.toString(htbls));
148 assertEquals(totalTableCount, htbls.length);
149 }
150
151 assertErrors(doFsck(conf, false), new ERROR_CODE[] {});
152 LOG.info("Table " + table + " has " + tableRowCount(conf, table) + " entries.");
153 assertEquals(16, tableRowCount(conf, table));
154 }
155 }