HBASE-1175 HBA administrative tools do not work when specifying region name
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@741018 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
46d3e17942
commit
08805166e8
|
@ -17,6 +17,8 @@ Release 0.20.0 - Unreleased
|
|||
HBASE-1148 Always flush HLog on root or meta region updates
|
||||
HBASE-1181 src/saveVersion.sh bails on non-standard Bourne shells (e.g. dash)
|
||||
(K M via Jean-Daniel Cryans)
|
||||
HBASE-1175 HBA administrative tools do not work when specifying region
|
||||
name (Jonathan Gray via Andrew Purtell)
|
||||
|
||||
IMPROVEMENTS
|
||||
HBASE-1089 Add count of regions on filesystem to master UI; add percentage
|
||||
|
|
|
@ -217,6 +217,47 @@ public class HRegionInfo extends VersionedWritable implements WritableComparable
|
|||
return b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Separate elements of a regionName.
|
||||
* @param regionName
|
||||
* @return Array of byte[] containing tableName, startKey and id
|
||||
*/
|
||||
public static byte [][] parseRegionName(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;
|
||||
|
|
|
@ -768,6 +768,29 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
|||
return null;
|
||||
}
|
||||
|
||||
private Pair<HRegionInfo,HServerAddress>
|
||||
getTableRegionFromName(final byte [] regionName)
|
||||
throws IOException {
|
||||
byte [] tableName = HRegionInfo.parseRegionName(regionName)[0];
|
||||
Set<MetaRegion> regions = regionManager.getMetaRegionsForTable(tableName);
|
||||
for (MetaRegion m: regions) {
|
||||
byte [] metaRegionName = m.getRegionName();
|
||||
HRegionInterface srvr = connection.getHRegionConnection(m.getServer());
|
||||
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<HRegionInfo,HServerAddress>(info, server);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get row from meta table.
|
||||
* @param row
|
||||
|
@ -813,9 +836,14 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
|||
if (!(args[0] instanceof ImmutableBytesWritable))
|
||||
throw new IOException(
|
||||
"request argument must be ImmutableBytesWritable");
|
||||
byte [] rowKey = ((ImmutableBytesWritable)args[0]).get();
|
||||
Pair<HRegionInfo,HServerAddress> pair =
|
||||
getTableRegionClosest(tableName, rowKey);
|
||||
Pair<HRegionInfo,HServerAddress> 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);
|
||||
|
|
Loading…
Reference in New Issue