HBASE-4379 [hbck] Does not complain about tables with no end region [Z,] (Anoop Sam John)
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1358953 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a7dcdedb86
commit
0318331ccd
|
@ -1702,6 +1702,13 @@ public class HBaseFsck {
|
||||||
getTableInfo(), hi);
|
getTableInfo(), hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRegionEndKeyNotEmpty(byte[] curEndKey) throws IOException {
|
||||||
|
errors.reportError(ERROR_CODE.LAST_REGION_ENDKEY_NOT_EMPTY,
|
||||||
|
"Last region should end with an empty key. You need to "
|
||||||
|
+ "create a new region and regioninfo in HDFS to plug the hole.", getTableInfo());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleDegenerateRegion(HbckInfo hi) throws IOException{
|
public void handleDegenerateRegion(HbckInfo hi) throws IOException{
|
||||||
errors.reportError(ERROR_CODE.DEGENERATE_REGION,
|
errors.reportError(ERROR_CODE.DEGENERATE_REGION,
|
||||||
|
@ -1786,6 +1793,21 @@ public class HBaseFsck {
|
||||||
fixes++;
|
fixes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void handleRegionEndKeyNotEmpty(byte[] curEndKey) throws IOException {
|
||||||
|
errors.reportError(ERROR_CODE.LAST_REGION_ENDKEY_NOT_EMPTY,
|
||||||
|
"Last region should end with an empty key. Creating a new "
|
||||||
|
+ "region and regioninfo in HDFS to plug the hole.", getTableInfo());
|
||||||
|
HTableDescriptor htd = getTableInfo().getHTD();
|
||||||
|
// from curEndKey to EMPTY_START_ROW
|
||||||
|
HRegionInfo newRegion = new HRegionInfo(htd.getName(), curEndKey,
|
||||||
|
HConstants.EMPTY_START_ROW);
|
||||||
|
|
||||||
|
HRegion region = HBaseFsckRepair.createHDFSRegionDir(conf, newRegion, htd);
|
||||||
|
LOG.info("Table region end key was not empty. Created new empty region: " + newRegion
|
||||||
|
+ " " + region);
|
||||||
|
fixes++;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* There is a hole in the hdfs regions that violates the table integrity
|
* There is a hole in the hdfs regions that violates the table integrity
|
||||||
* rules. Create a new empty region that patches the hole.
|
* rules. Create a new empty region that patches the hole.
|
||||||
|
@ -1955,6 +1977,12 @@ public class HBaseFsck {
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public boolean checkRegionChain(TableIntegrityErrorHandler handler) throws IOException {
|
public boolean checkRegionChain(TableIntegrityErrorHandler handler) throws IOException {
|
||||||
|
// When table is disabled no need to check for the region chain. Some of the regions
|
||||||
|
// accidently if deployed, this below code might report some issues like missing start
|
||||||
|
// or end regions or region hole in chain and may try to fix which is unwanted.
|
||||||
|
if (disabledTables.contains(this.tableName.getBytes())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
int originalErrorsCount = errors.getErrorList().size();
|
int originalErrorsCount = errors.getErrorList().size();
|
||||||
Multimap<byte[], HbckInfo> regions = sc.calcCoverage();
|
Multimap<byte[], HbckInfo> regions = sc.calcCoverage();
|
||||||
SortedSet<byte[]> splits = sc.getSplits();
|
SortedSet<byte[]> splits = sc.getSplits();
|
||||||
|
@ -2026,6 +2054,12 @@ public class HBaseFsck {
|
||||||
prevKey = key;
|
prevKey = key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When the last region of a table is proper and having an empty end key, 'prevKey'
|
||||||
|
// will be null.
|
||||||
|
if (prevKey != null) {
|
||||||
|
handler.handleRegionEndKeyNotEmpty(prevKey);
|
||||||
|
}
|
||||||
|
|
||||||
for (Collection<HbckInfo> overlap : overlapGroups.asMap().values()) {
|
for (Collection<HbckInfo> overlap : overlapGroups.asMap().values()) {
|
||||||
handler.handleOverlapGroup(overlap);
|
handler.handleOverlapGroup(overlap);
|
||||||
}
|
}
|
||||||
|
@ -2536,7 +2570,7 @@ public class HBaseFsck {
|
||||||
UNKNOWN, NO_META_REGION, NULL_ROOT_REGION, NO_VERSION_FILE, NOT_IN_META_HDFS, NOT_IN_META,
|
UNKNOWN, NO_META_REGION, NULL_ROOT_REGION, NO_VERSION_FILE, NOT_IN_META_HDFS, NOT_IN_META,
|
||||||
NOT_IN_META_OR_DEPLOYED, NOT_IN_HDFS_OR_DEPLOYED, NOT_IN_HDFS, SERVER_DOES_NOT_MATCH_META, NOT_DEPLOYED,
|
NOT_IN_META_OR_DEPLOYED, NOT_IN_HDFS_OR_DEPLOYED, NOT_IN_HDFS, SERVER_DOES_NOT_MATCH_META, NOT_DEPLOYED,
|
||||||
MULTI_DEPLOYED, SHOULD_NOT_BE_DEPLOYED, MULTI_META_REGION, RS_CONNECT_FAILURE,
|
MULTI_DEPLOYED, SHOULD_NOT_BE_DEPLOYED, MULTI_META_REGION, RS_CONNECT_FAILURE,
|
||||||
FIRST_REGION_STARTKEY_NOT_EMPTY, DUPE_STARTKEYS,
|
FIRST_REGION_STARTKEY_NOT_EMPTY, LAST_REGION_ENDKEY_NOT_EMPTY, DUPE_STARTKEYS,
|
||||||
HOLE_IN_REGION_CHAIN, OVERLAP_IN_REGION_CHAIN, REGION_CYCLE, DEGENERATE_REGION,
|
HOLE_IN_REGION_CHAIN, OVERLAP_IN_REGION_CHAIN, REGION_CYCLE, DEGENERATE_REGION,
|
||||||
ORPHAN_HDFS_REGION, LINGERING_SPLIT_PARENT
|
ORPHAN_HDFS_REGION, LINGERING_SPLIT_PARENT
|
||||||
}
|
}
|
||||||
|
@ -2544,6 +2578,7 @@ public class HBaseFsck {
|
||||||
public void report(String message);
|
public void report(String message);
|
||||||
public void reportError(String message);
|
public void reportError(String message);
|
||||||
public void reportError(ERROR_CODE errorCode, String message);
|
public void reportError(ERROR_CODE errorCode, String message);
|
||||||
|
public void reportError(ERROR_CODE errorCode, String message, TableInfo table);
|
||||||
public void reportError(ERROR_CODE errorCode, String message, TableInfo table, HbckInfo info);
|
public void reportError(ERROR_CODE errorCode, String message, TableInfo table, HbckInfo info);
|
||||||
public void reportError(ERROR_CODE errorCode, String message, TableInfo table, HbckInfo info1, HbckInfo info2);
|
public void reportError(ERROR_CODE errorCode, String message, TableInfo table, HbckInfo info1, HbckInfo info2);
|
||||||
public int summarize();
|
public int summarize();
|
||||||
|
@ -2579,6 +2614,11 @@ public class HBaseFsck {
|
||||||
showProgress = 0;
|
showProgress = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void reportError(ERROR_CODE errorCode, String message, TableInfo table) {
|
||||||
|
errorTables.add(table);
|
||||||
|
reportError(errorCode, message);
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized void reportError(ERROR_CODE errorCode, String message, TableInfo table,
|
public synchronized void reportError(ERROR_CODE errorCode, String message, TableInfo table,
|
||||||
HbckInfo info) {
|
HbckInfo info) {
|
||||||
errorTables.add(table);
|
errorTables.add(table);
|
||||||
|
|
|
@ -48,6 +48,15 @@ public interface TableIntegrityErrorHandler {
|
||||||
* has an empty start key.
|
* has an empty start key.
|
||||||
*/
|
*/
|
||||||
void handleRegionStartKeyNotEmpty(HbckInfo hi) throws IOException;
|
void handleRegionStartKeyNotEmpty(HbckInfo hi) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for handling case where a Table has a last region that does not
|
||||||
|
* have an empty end key.
|
||||||
|
*
|
||||||
|
* @param curEndKey The end key of the current last region. There should be a new region
|
||||||
|
* with start key as this and an empty end key.
|
||||||
|
*/
|
||||||
|
void handleRegionEndKeyNotEmpty(byte[] curEndKey) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback for handling a region that has the same start and end key.
|
* Callback for handling a region that has the same start and end key.
|
||||||
|
|
|
@ -53,6 +53,13 @@ abstract public class TableIntegrityErrorHandlerImpl implements
|
||||||
@Override
|
@Override
|
||||||
public void handleRegionStartKeyNotEmpty(HbckInfo hi) throws IOException {
|
public void handleRegionStartKeyNotEmpty(HbckInfo hi) throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void handleRegionEndKeyNotEmpty(byte[] curEndKey) throws IOException {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
|
|
|
@ -1094,6 +1094,62 @@ public class TestHBaseFsck {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This creates and fixes a bad table with a missing region which is the 1st region -- hole in
|
||||||
|
* meta and data missing in the fs.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMissingFirstRegion() throws Exception {
|
||||||
|
String table = "testMissingFirstRegion";
|
||||||
|
try {
|
||||||
|
setupTable(table);
|
||||||
|
assertEquals(ROWKEYS.length, countRows());
|
||||||
|
|
||||||
|
// Mess it up by leaving a hole in the assignment, meta, and hdfs data
|
||||||
|
TEST_UTIL.getHBaseAdmin().disableTable(table);
|
||||||
|
deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(""), Bytes.toBytes("A"), true,
|
||||||
|
true, true);
|
||||||
|
TEST_UTIL.getHBaseAdmin().enableTable(table);
|
||||||
|
|
||||||
|
HBaseFsck hbck = doFsck(conf, false);
|
||||||
|
assertErrors(hbck, new ERROR_CODE[] { ERROR_CODE.FIRST_REGION_STARTKEY_NOT_EMPTY });
|
||||||
|
// fix hole
|
||||||
|
doFsck(conf, true);
|
||||||
|
// check that hole fixed
|
||||||
|
assertNoErrors(doFsck(conf, false));
|
||||||
|
} finally {
|
||||||
|
deleteTable(table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This creates and fixes a bad table with missing last region -- hole in meta and data missing in
|
||||||
|
* the fs.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMissingLastRegion() throws Exception {
|
||||||
|
String table = "testMissingLastRegion";
|
||||||
|
try {
|
||||||
|
setupTable(table);
|
||||||
|
assertEquals(ROWKEYS.length, countRows());
|
||||||
|
|
||||||
|
// Mess it up by leaving a hole in the assignment, meta, and hdfs data
|
||||||
|
TEST_UTIL.getHBaseAdmin().disableTable(table);
|
||||||
|
deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes("C"), Bytes.toBytes(""), true,
|
||||||
|
true, true);
|
||||||
|
TEST_UTIL.getHBaseAdmin().enableTable(table);
|
||||||
|
|
||||||
|
HBaseFsck hbck = doFsck(conf, false);
|
||||||
|
assertErrors(hbck, new ERROR_CODE[] { ERROR_CODE.LAST_REGION_ENDKEY_NOT_EMPTY });
|
||||||
|
// fix hole
|
||||||
|
doFsck(conf, true);
|
||||||
|
// check that hole fixed
|
||||||
|
assertNoErrors(doFsck(conf, false));
|
||||||
|
} finally {
|
||||||
|
deleteTable(table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@org.junit.Rule
|
@org.junit.Rule
|
||||||
public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
|
public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
|
||||||
new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
|
new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
|
||||||
|
|
Loading…
Reference in New Issue