Index: src/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (revision 892927) +++ src/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (working copy) @@ -789,11 +789,6 @@ } try { this.editsSize.addAndGet(logKey.heapSize() + logEdit.heapSize()); - if (LOG.isDebugEnabled() && - (this.numEntries.get() % this.flushlogentries == 0)) { - LOG.debug("edit=" + this.numEntries.get() + ", write=" + - logKey.toString()); - } this.writer.append(new HLog.Entry(logKey, logEdit)); long took = System.currentTimeMillis() - now; if (took > 1000) { Index: src/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java (revision 892927) +++ src/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java (working copy) @@ -35,6 +35,7 @@ import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Writables; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.util.StringUtils; /** @@ -194,12 +195,18 @@ put = new Put(newRegions[i].getRegionName()); put.add(CATALOG_FAMILY, REGIONINFO_QUALIFIER, Writables.getBytes( newRegions[i].getRegionInfo())); + put.add(CATALOG_FAMILY, SERVER_QUALIFIER, + Bytes.toBytes(this.server.getHServerInfo(). + getServerAddress().toString())); + put.add(CATALOG_FAMILY, STARTCODE_QUALIFIER, + Bytes.toBytes(this.server.getHServerInfo().getStartCode())); t.put(put); + } // Now tell the master about the new regions server.reportSplit(oldRegionInfo, newRegions[0].getRegionInfo(), - newRegions[1].getRegionInfo()); + newRegions[1].getRegionInfo()); LOG.info("region split, META updated, and report to master all" + " successful. Old region=" + oldRegionInfo.toString() + ", new regions: " + newRegions[0].toString() + ", " + @@ -207,6 +214,8 @@ StringUtils.formatTimeDiff(System.currentTimeMillis(), startTime)); // Do not serve the new regions. Let the Master assign them. + this.server.openRegion(newRegions[0].getRegionInfo()); + this.server.openRegion(newRegions[1].getRegionInfo()); } /** Index: src/java/org/apache/hadoop/hbase/master/ServerManager.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/ServerManager.java (revision 892927) +++ src/java/org/apache/hadoop/hbase/master/ServerManager.java (working copy) @@ -432,7 +432,8 @@ break; case MSG_REPORT_SPLIT: - processSplitRegion(region, incomingMsgs[++i], incomingMsgs[++i]); + processSplitRegion(region, serverInfo, + incomingMsgs[++i], incomingMsgs[++i]); break; default: @@ -473,14 +474,15 @@ * @param splitB * @param returnMsgs */ - private void processSplitRegion(HRegionInfo region, HMsg splitA, HMsg splitB) { + private void processSplitRegion(HRegionInfo region, HServerInfo server, + HMsg splitA, HMsg splitB) { synchronized (master.getRegionManager()) { // Cancel any actions pending for the affected region. // This prevents the master from sending a SPLIT message if the table // has already split by the region server. this.master.getRegionManager().endActions(region.getRegionName()); - assignSplitDaughter(splitA.getRegionInfo()); - assignSplitDaughter(splitB.getRegionInfo()); + assignSplitDaughter(splitA.getRegionInfo(), server); + assignSplitDaughter(splitB.getRegionInfo(), server); if (region.isMetaTable()) { // A meta region has split. this.master.getRegionManager().offlineMetaRegion(region.getStartKey()); @@ -497,7 +499,8 @@ * HBASE-1784). * @param hri Region to assign. */ - private void assignSplitDaughter(final HRegionInfo hri) { + private void assignSplitDaughter(final HRegionInfo hri, + final HServerInfo serverInfo) { MetaRegion mr = this.master.getRegionManager().getFirstMetaRegionForRegion(hri); Get g = new Get(hri.getRegionName()); @@ -507,13 +510,22 @@ this.master.getServerConnection().getHRegionConnection(mr.getServer()); Result r = server.get(mr.getRegionName(), g); // If size > 3 -- presume regioninfo, startcode and server -- then presume - // that this daughter already assigned and return. - if (r.size() >= 3) return; + // that this daughter already assigned and return. Unless it's to this same + // region server. + if (r.size() >= 3 && !( + Bytes.equals(r.getValue(CATALOG_FAMILY, SERVER_QUALIFIER), + Bytes.toBytes(serverInfo.getServerAddress().toString())) && + Bytes.equals(r.getValue(CATALOG_FAMILY, STARTCODE_QUALIFIER), + Bytes.toBytes(serverInfo.getStartCode())) + )) { + return; + } } catch (IOException e) { LOG.warn("Failed get on " + HConstants.CATALOG_FAMILY_STR + "; possible double-assignment?", e); } this.master.getRegionManager().setUnassigned(hri, false); + this.master.getRegionManager().setPendingOpen(serverInfo, hri); } /* Index: src/java/org/apache/hadoop/hbase/master/RegionManager.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/RegionManager.java (revision 892927) +++ src/java/org/apache/hadoop/hbase/master/RegionManager.java (working copy) @@ -928,8 +928,8 @@ return false; } - /** - * Set a region to unassigned + /** + * Set a region to unassigned * @param info Region to set unassigned * @param force if true mark region unassigned whatever its current state */ @@ -945,6 +945,20 @@ } } } + + /** + * Set a region to pending open + * @param server Server that is opening the region + * @param info Region to set unassigned] + */ + public void setPendingOpen(HServerInfo server, HRegionInfo info) { + synchronized(this.regionsInTransition) { + RegionState s = regionsInTransition.get(info.getRegionNameAsString()); + if (s != null) { + s.setPendingOpen(server.getName()); + } + } + } /** * Check if a region is on the unassigned list