blob: 7ced1b3072a30d1f3749ef5748861c86dbb225b4 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hbase.client;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
import org.apache.hadoop.hbase.master.RegionState;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.yetus.audience.InterfaceAudience;
import java.io.IOException;
/**
* Utility used composing RegionInfo for 'display'; e.g. on the web UI
*/
@InterfaceAudience.Private
public class RegionInfoDisplay {
public final static String DISPLAY_KEYS_KEY = "hbase.display.keys";
public final static byte[] HIDDEN_END_KEY = Bytes.toBytes("hidden-end-key");
public final static byte[] HIDDEN_START_KEY = Bytes.toBytes("hidden-start-key");
/**
* Get the descriptive name as {@link RegionState} does it but with hidden
* startkey optionally
* @return descriptive string
*/
public static String getDescriptiveNameFromRegionStateForDisplay(RegionState state,
Configuration conf) {
if (conf.getBoolean(DISPLAY_KEYS_KEY, true)) return state.toDescriptiveString();
String descriptiveStringFromState = state.toDescriptiveString();
int idx = descriptiveStringFromState.lastIndexOf(" state=");
String regionName = getRegionNameAsStringForDisplay(
RegionInfoBuilder.newBuilder(state.getRegion()).build(), conf);
return regionName + descriptiveStringFromState.substring(idx);
}
/**
* Get the end key for display. Optionally hide the real end key.
* @return the endkey
*/
public static byte[] getEndKeyForDisplay(RegionInfo ri, Configuration conf) {
boolean displayKey = conf.getBoolean(DISPLAY_KEYS_KEY, true);
if (displayKey) return ri.getEndKey();
return HIDDEN_END_KEY;
}
/**
* Get the start key for display. Optionally hide the real start key.
* @param ri
* @param conf
* @return the startkey
*/
public static byte[] getStartKeyForDisplay(RegionInfo ri, Configuration conf) {
boolean displayKey = conf.getBoolean(DISPLAY_KEYS_KEY, true);
if (displayKey) return ri.getStartKey();
return HIDDEN_START_KEY;
}
/**
* Get the region name for display. Optionally hide the start key.
* @param ri
* @param conf
* @return region name as String
*/
public static String getRegionNameAsStringForDisplay(RegionInfo ri, Configuration conf) {
return Bytes.toStringBinary(getRegionNameForDisplay(ri, conf));
}
/**
* Get the region name for display. Optionally hide the start key.
* @param ri
* @param conf
* @return region name bytes
*/
public static byte[] getRegionNameForDisplay(RegionInfo ri, Configuration conf) {
boolean displayKey = conf.getBoolean(DISPLAY_KEYS_KEY, true);
if (displayKey || ri.getTable().equals(TableName.META_TABLE_NAME)) {
return ri.getRegionName();
} else {
// create a modified regionname with the startkey replaced but preserving
// the other parts including the encodedname.
try {
byte[][]regionNameParts = RegionInfo.parseRegionName(ri.getRegionName());
regionNameParts[1] = HIDDEN_START_KEY; //replace the real startkey
int len = 0;
// get the total length
for (byte[] b : regionNameParts) {
len += b.length;
}
byte[] encodedRegionName =
Bytes.toBytes(RegionInfo.encodeRegionName(ri.getRegionName()));
len += encodedRegionName.length;
//allocate some extra bytes for the delimiters and the last '.'
byte[] modifiedName = new byte[len + regionNameParts.length + 1];
int lengthSoFar = 0;
int loopCount = 0;
for (byte[] b : regionNameParts) {
System.arraycopy(b, 0, modifiedName, lengthSoFar, b.length);
lengthSoFar += b.length;
if (loopCount++ == 2) modifiedName[lengthSoFar++] = RegionInfo.REPLICA_ID_DELIMITER;
else modifiedName[lengthSoFar++] = HConstants.DELIMITER;
}
// replace the last comma with '.'
modifiedName[lengthSoFar - 1] = RegionInfo.ENC_SEPARATOR;
System.arraycopy(encodedRegionName, 0, modifiedName, lengthSoFar,
encodedRegionName.length);
lengthSoFar += encodedRegionName.length;
modifiedName[lengthSoFar] = RegionInfo.ENC_SEPARATOR;
return modifiedName;
} catch (IOException e) {
//LOG.warn("Encountered exception " + e);
throw new RuntimeException(e);
}
}
}
}