Index: conf/hbase-env.sh =================================================================== --- conf/hbase-env.sh (revision 1126592) +++ conf/hbase-env.sh (working copy) @@ -36,8 +36,8 @@ # see http://wiki.apache.org/hadoop/PerformanceTuning export HBASE_OPTS="-ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode" -# Uncomment below to enable java garbage collection logging. -# export HBASE_OPTS="$HBASE_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$HBASE_HOME/logs/gc-hbase.log" +# Uncomment below to enable java garbage collection logging in the .out file. +# export HBASE_OPTS="$HBASE_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps" # Uncomment and adjust to enable JMX exporting # See jmxremote.password and jmxremote.access in $JRE_HOME/lib/management to configure remote password access. Index: src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java (revision 1126592) +++ src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java (working copy) @@ -1113,6 +1113,6 @@ (data == null? "null": ( znode.startsWith(zkw.assignmentZNode) ? RegionTransitionData.fromBytes(data).toString() - : StringUtils.abbreviate(Bytes.toString(data), 32))))); + : StringUtils.abbreviate(Bytes.toStringBinary(data), 32))))); } } Index: src/main/java/org/apache/hadoop/hbase/executor/RegionTransitionData.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/executor/RegionTransitionData.java (revision 1126592) +++ src/main/java/org/apache/hadoop/hbase/executor/RegionTransitionData.java (working copy) @@ -204,7 +204,7 @@ @Override public String toString() { - return "region=" + Bytes.toString(regionName) + ", server=" + serverName + - ", state=" + eventType; + return "region=" + Bytes.toStringBinary(regionName) + + ", server=" + serverName + ", state=" + eventType; } } Index: src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java (revision 1126592) +++ src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java (working copy) @@ -386,12 +386,8 @@ if (inMeta && inHdfs && isDeployed && deploymentMatchesMeta && shouldBeDeployed) { return; } else if (inMeta && !isDeployed && splitParent) { - // Offline regions shouldn't cause complaints - LOG.debug("Region " + descriptiveName + " offline, split, parent, ignoring."); return; } else if (inMeta && !shouldBeDeployed && !isDeployed) { - // offline regions shouldn't cause complaints - LOG.debug("Region " + descriptiveName + " offline, ignoring."); return; } else if (recentlyModified) { LOG.warn("Region " + descriptiveName + " was recently modified -- skipping"); @@ -408,7 +404,7 @@ } else if (!inMeta && inHdfs && !isDeployed) { errors.reportError(ERROR_CODE.NOT_IN_META_OR_DEPLOYED, "Region " + descriptiveName + " on HDFS, but not listed in META " + - "or deployed on any region server."); + "or deployed on any region server"); } else if (!inMeta && inHdfs && isDeployed) { errors.reportError(ERROR_CODE.NOT_IN_META, "Region " + descriptiveName + " not in META, but deployed on " + Joiner.on(", ").join(hbi.deployedOn)); @@ -549,6 +545,7 @@ public boolean checkRegionChain() { Collections.sort(regions); HbckInfo last = null; + int originalErrorsCount = errors.getErrorList().size(); for (HbckInfo r : regions) { if (last == null) { @@ -572,8 +569,8 @@ errors.reportError(ERROR_CODE.REGION_CYCLE, String.format("The endkey for this region comes before the " + "startkey, startkey=%s, endkey=%s", - Bytes.toString(r.metaEntry.getStartKey()), - Bytes.toString(r.metaEntry.getEndKey())), + Bytes.toStringBinary(r.metaEntry.getStartKey()), + Bytes.toStringBinary(r.metaEntry.getEndKey())), this, r, last); } } @@ -582,7 +579,7 @@ if (Bytes.equals(r.metaEntry.getStartKey(), last.metaEntry.getStartKey())) { errors.reportError(ERROR_CODE.DUPE_STARTKEYS, "Two regions have the same startkey: " - + Bytes.toString(r.metaEntry.getStartKey()), + + Bytes.toStringBinary(r.metaEntry.getStartKey()), this, r, last); } else { // Check that the startkey is the same as the previous end key @@ -606,7 +603,7 @@ last = r; } - return errors.getErrorList().size() == 0; + return errors.getErrorList().size() == originalErrorsCount; } } Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1126868) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -1943,7 +1943,11 @@ case OPEN: LOG.error("Region has been OPEN for too long, " + "we don't know where region was opened so can't do anything"); + synchronized(regionState) { + regionState.updateTimestampToNow(); + } break; + case PENDING_CLOSE: LOG.info("Region has been PENDING_CLOSE for too " + "long, running forced unassign again on region=" + Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1126868) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -51,7 +51,6 @@ import org.apache.hadoop.hbase.catalog.CatalogTracker; import org.apache.hadoop.hbase.catalog.MetaEditor; import org.apache.hadoop.hbase.catalog.MetaReader; -import org.apache.hadoop.hbase.client.HConnectionManager; import org.apache.hadoop.hbase.client.MetaScanner; import org.apache.hadoop.hbase.client.MetaScanner.MetaScannerVisitor; import org.apache.hadoop.hbase.client.Result; @@ -915,13 +914,17 @@ region.getLog().closeAndDelete(); } - // 5. Trigger immediate assignment of the regions in round-robin fashion - List servers = serverManager.getOnlineServersList(); - try { - this.assignmentManager.assignUserRegions(Arrays.asList(newRegions), servers); - } catch (InterruptedException ie) { - LOG.error("Caught " + ie + " during round-robin assignment"); - throw new IOException(ie); + if (newRegions.length == 1) { + this.assignmentManager.assign(newRegions[0], true); + } else { + // 5. Trigger immediate assignment of the regions in round-robin fashion + List servers = serverManager.getOnlineServersList(); + try { + this.assignmentManager.assignUserRegions(Arrays.asList(newRegions), servers); + } catch (InterruptedException ie) { + LOG.error("Caught " + ie + " during round-robin assignment"); + throw new IOException(ie); + } } // 6. If sync, wait for assignment of regions