diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java index 3c8b2add83f..22713ec22fe 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java @@ -103,6 +103,7 @@ import org.apache.hadoop.hbase.util.hbck.TableLockChecker; import org.apache.hadoop.hbase.zookeeper.MetaRegionTracker; import org.apache.hadoop.hbase.zookeeper.ZKTableReadOnly; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.ReflectionUtils; @@ -3923,49 +3924,53 @@ public class HBaseFsck extends Configured { // do the real work of hbck connect(); - // if corrupt file mode is on, first fix them since they may be opened later - if (checkCorruptHFiles || sidelineCorruptHFiles) { - LOG.info("Checking all hfiles for corruption"); - HFileCorruptionChecker hfcc = createHFileCorruptionChecker(sidelineCorruptHFiles); - setHFileCorruptionChecker(hfcc); // so we can get result - Collection tables = getIncludedTables(); - Collection tableDirs = new ArrayList(); - Path rootdir = FSUtils.getRootDir(getConf()); - if (tables.size() > 0) { - for (TableName t : tables) { - tableDirs.add(FSUtils.getTableDir(rootdir, t)); + try { + // if corrupt file mode is on, first fix them since they may be opened later + if (checkCorruptHFiles || sidelineCorruptHFiles) { + LOG.info("Checking all hfiles for corruption"); + HFileCorruptionChecker hfcc = createHFileCorruptionChecker(sidelineCorruptHFiles); + setHFileCorruptionChecker(hfcc); // so we can get result + Collection tables = getIncludedTables(); + Collection tableDirs = new ArrayList(); + Path rootdir = FSUtils.getRootDir(getConf()); + if (tables.size() > 0) { + for (TableName t : tables) { + tableDirs.add(FSUtils.getTableDir(rootdir, t)); + } + } else { + tableDirs = FSUtils.getTableDirs(FSUtils.getCurrentFileSystem(getConf()), rootdir); } - } else { - tableDirs = FSUtils.getTableDirs(FSUtils.getCurrentFileSystem(getConf()), rootdir); + hfcc.checkTables(tableDirs); + hfcc.report(errors); } - hfcc.checkTables(tableDirs); - hfcc.report(errors); - } - // check and fix table integrity, region consistency. - int code = onlineHbck(); - setRetCode(code); - // If we have changed the HBase state it is better to run hbck again - // to see if we haven't broken something else in the process. - // We run it only once more because otherwise we can easily fall into - // an infinite loop. - if (shouldRerun()) { - try { - LOG.info("Sleeping " + sleepBeforeRerun + "ms before re-checking after fix..."); - Thread.sleep(sleepBeforeRerun); - } catch (InterruptedException ie) { - return this; - } - // Just report - setFixAssignments(false); - setFixMeta(false); - setFixHdfsHoles(false); - setFixHdfsOverlaps(false); - setFixVersionFile(false); - setFixTableOrphans(false); - errors.resetErrors(); - code = onlineHbck(); + // check and fix table integrity, region consistency. + int code = onlineHbck(); setRetCode(code); + // If we have changed the HBase state it is better to run hbck again + // to see if we haven't broken something else in the process. + // We run it only once more because otherwise we can easily fall into + // an infinite loop. + if (shouldRerun()) { + try { + LOG.info("Sleeping " + sleepBeforeRerun + "ms before re-checking after fix..."); + Thread.sleep(sleepBeforeRerun); + } catch (InterruptedException ie) { + return this; + } + // Just report + setFixAssignments(false); + setFixMeta(false); + setFixHdfsHoles(false); + setFixHdfsOverlaps(false); + setFixVersionFile(false); + setFixTableOrphans(false); + errors.resetErrors(); + code = onlineHbck(); + setRetCode(code); + } + } finally { + IOUtils.cleanup(null, connection, meta, admin); } return this; }