You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jm...@apache.org on 2012/07/09 09:48:00 UTC
svn commit: r1358957 - in /hbase/branches/0.92: ./
src/main/java/org/apache/hadoop/hbase/util/
src/main/java/org/apache/hadoop/hbase/util/hbck/
src/test/java/org/apache/hadoop/hbase/util/
Author: jmhsieh
Date: Mon Jul 9 07:48:00 2012
New Revision: 1358957
URL: http://svn.apache.org/viewvc?rev=1358957&view=rev
Log:
HBASE-4379 [hbck] Does not complain about tables with no end region [Z,] (Anoop Sam John)
Modified:
hbase/branches/0.92/CHANGES.txt
hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java
hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandler.java
hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandlerImpl.java
hbase/branches/0.92/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java
Modified: hbase/branches/0.92/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/CHANGES.txt?rev=1358957&r1=1358956&r2=1358957&view=diff
==============================================================================
--- hbase/branches/0.92/CHANGES.txt (original)
+++ hbase/branches/0.92/CHANGES.txt Mon Jul 9 07:48:00 2012
@@ -88,6 +88,7 @@ Release 0.92.2 - Unreleased
HBASE-6281 Assignment need not be called for disabling table regions
during clean cluster start up (Rajesh Babu)
HBASE-6313 Client hangs because the client is not notified (binlijin)
+ HBASE-4379 [hbck] Does not complain about tables with no end region [z,] (Anoop Sam John)
IMPROVEMENTS
HBASE-5592 Make it easier to get a table from shell (Ben West)
Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java?rev=1358957&r1=1358956&r2=1358957&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java Mon Jul 9 07:48:00 2012
@@ -1692,6 +1692,13 @@ public class HBaseFsck {
+ " create a new region and regioninfo in HDFS to plug the hole.",
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
public void handleDegenerateRegion(HbckInfo hi) throws IOException{
@@ -1777,6 +1784,21 @@ public class HBaseFsck {
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
* rules. Create a new empty region that patches the hole.
@@ -1946,6 +1968,12 @@ public class HBaseFsck {
* @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();
Multimap<byte[], HbckInfo> regions = sc.calcCoverage();
SortedSet<byte[]> splits = sc.getSplits();
@@ -2017,6 +2045,12 @@ public class HBaseFsck {
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()) {
handler.handleOverlapGroup(overlap);
}
@@ -2527,7 +2561,7 @@ public class HBaseFsck {
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,
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,
ORPHAN_HDFS_REGION, LINGERING_SPLIT_PARENT
}
@@ -2535,6 +2569,7 @@ public class HBaseFsck {
public void report(String message);
public void reportError(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 info1, HbckInfo info2);
public int summarize();
@@ -2570,6 +2605,11 @@ public class HBaseFsck {
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,
HbckInfo info) {
errorTables.add(table);
Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandler.java?rev=1358957&r1=1358956&r2=1358957&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandler.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandler.java Mon Jul 9 07:48:00 2012
@@ -48,6 +48,15 @@ public interface TableIntegrityErrorHand
* has an empty start key.
*/
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.
Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandlerImpl.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandlerImpl.java?rev=1358957&r1=1358956&r2=1358957&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandlerImpl.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/util/hbck/TableIntegrityErrorHandlerImpl.java Mon Jul 9 07:48:00 2012
@@ -58,6 +58,13 @@ abstract public class TableIntegrityErro
* {@inheritDoc}
*/
@Override
+ public void handleRegionEndKeyNotEmpty(byte[] curEndKey) throws IOException {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void handleDegenerateRegion(HbckInfo hi) throws IOException {
}
Modified: hbase/branches/0.92/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java?rev=1358957&r1=1358956&r2=1358957&view=diff
==============================================================================
--- hbase/branches/0.92/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java (original)
+++ hbase/branches/0.92/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java Mon Jul 9 07:48:00 2012
@@ -1007,6 +1007,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);
+ }
+ }
+
+ /**
* A split parent in meta, in hdfs, and not deployed
*/
@Test