Index: src/java/org/apache/hadoop/hbase/HRegionInfo.java =================================================================== --- src/java/org/apache/hadoop/hbase/HRegionInfo.java (revision 740159) +++ src/java/org/apache/hadoop/hbase/HRegionInfo.java (working copy) @@ -217,6 +217,45 @@ return b; } + /** + * Separate elements of a regionName. + * @param regionName + * @return Array of byte[] containing tableName, startKey and id + */ + public static byte [][] splitRegionName(final byte [] regionName) + throws IOException { + int offset = -1; + for (int i = 0; i < regionName.length; i++) { + if (regionName[i] == DELIMITER) { + offset = i; + break; + } + } + if(offset == -1) throw new IOException("Invalid regionName format"); + byte [] tableName = new byte[offset]; + System.arraycopy(regionName, 0, tableName, 0, offset); + offset = -1; + for (int i = regionName.length - 1; i > 0; i--) { + if(regionName[i] == DELIMITER) { + offset = i; + break; + } + } + if(offset == -1) throw new IOException("Invalid regionName format"); + byte [] startKey = HConstants.EMPTY_BYTE_ARRAY; + if(offset != tableName.length + 1) { + startKey = new byte[offset - tableName.length - 1]; + System.arraycopy(regionName, tableName.length + 1, startKey, 0, offset - tableName.length - 1); + } + byte [] id = new byte[regionName.length - offset - 1]; + System.arraycopy(regionName, offset + 1, id, 0, regionName.length - offset - 1); + byte [][] elements = new byte[3][]; + elements[0] = tableName; + elements[1] = startKey; + elements[2] = id; + return elements; + } + /** @return the endKey */ public byte [] getEndKey(){ return endKey; Index: src/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/HMaster.java (revision 740159) +++ src/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -767,6 +767,32 @@ return null; } + private Pair + getTableRegionFromName(final byte [] regionName) + throws IOException { + byte [][] splitRegionName = HRegionInfo.splitRegionName(regionName); + byte [] tableName = splitRegionName[0]; + byte [] startKey = splitRegionName[1]; + Set regions = regionManager.getMetaRegionsForTable(tableName); + for (MetaRegion m: regions) { + byte [] metaRegionName = m.getRegionName(); + HRegionInterface srvr = connection.getHRegionConnection(m.getServer()); + byte [][] columns = {HConstants.COLUMN_FAMILY}; + RowResult data = srvr.getRow(metaRegionName, regionName, + new byte[][] {COL_REGIONINFO, COL_SERVER}, + HConstants.LATEST_TIMESTAMP, 1, -1L); + if(data == null || data.size() <= 0) continue; + HRegionInfo info = Writables.getHRegionInfo(data.get(COL_REGIONINFO)); + Cell cell = data.get(COL_SERVER); + if(cell != null) { + HServerAddress server = + new HServerAddress(Bytes.toString(cell.getValue())); + return new Pair(info, server); + } + } + return null; + } + /** * Get row from meta table. * @param row @@ -812,9 +838,14 @@ if (!(args[0] instanceof ImmutableBytesWritable)) throw new IOException( "request argument must be ImmutableBytesWritable"); - byte [] rowKey = ((ImmutableBytesWritable)args[0]).get(); - Pair pair = - getTableRegionClosest(tableName, rowKey); + Pair pair = null; + if(tableName == null) { + byte [] regionName = ((ImmutableBytesWritable)args[0]).get(); + pair = getTableRegionFromName(regionName); + } else { + byte [] rowKey = ((ImmutableBytesWritable)args[0]).get(); + pair = getTableRegionClosest(tableName, rowKey); + } if (pair != null) { this.regionManager.startAction(pair.getFirst().getRegionName(), pair.getFirst(), pair.getSecond(), op);