Repository: hbase
Updated Branches:
refs/heads/0.98 57e947c45 -> afe33d1db
HBASE-7332 [webui] HMaster webui should display the number of regions a table
has. (Andrey Stepachev)
Conflicts:
hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/afe33d1d
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/afe33d1d
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/afe33d1d
Branch: refs/heads/0.98
Commit: afe33d1db079a51f019ba7979f42599f730d7c6c
Parents: 57e947c
Author: Andrew Purtell <[email protected]>
Authored: Thu Feb 5 12:01:38 2015 -0800
Committer: Andrew Purtell <[email protected]>
Committed: Thu Feb 5 12:01:38 2015 -0800
----------------------------------------------------------------------
.../hbase/tmpl/master/MasterStatusTmpl.jamon | 31 ++++++++++++-
.../hadoop/hbase/master/RegionStates.java | 48 +++++++++++++++++++-
.../master/TestAssignmentManagerOnCluster.java | 6 +--
3 files changed, 78 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/afe33d1d/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
----------------------------------------------------------------------
diff --git
a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
index b77d9f4..a518cca 100644
---
a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
+++
b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
@@ -44,6 +44,8 @@ org.apache.hadoop.hbase.ServerLoad;
org.apache.hadoop.hbase.ServerName;
org.apache.hadoop.hbase.client.HBaseAdmin;
org.apache.hadoop.hbase.client.HConnectionManager;
+org.apache.hadoop.hbase.HRegionInfo;
+org.apache.hadoop.hbase.master.RegionState;
org.apache.hadoop.hbase.HTableDescriptor;
org.apache.hadoop.hbase.HBaseConfiguration;
org.apache.hadoop.hbase.TableName;
@@ -348,17 +350,42 @@ AssignmentManager assignmentManager =
master.getAssignmentManager();
<th title="Fragmentation - Will be 0% after a major compaction and
fluctuate during normal usage.">Frag.</th>
</%if>
<th>Online Regions</th>
+ <th>Offline Regions</th>
+ <th>Failed Regions</th>
+ <th>Split Regions</th>
+ <th>Other Regions</th>
<th>Description</th>
</tr>
<%for HTableDescriptor htDesc : tables%>
+ <%java>
+ Map<RegionState.State, List<HRegionInfo>> tableRegions =
+ master.getAssignmentManager().getRegionStates()
+ .getRegionByStateOfTable(htDesc.getTableName());
+ int openRegionsCount = tableRegions.get(RegionState.State.OPEN).size();
+ int offlineRegionsCount =
tableRegions.get(RegionState.State.OFFLINE).size();
+ int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
+ int failedRegionsCount =
tableRegions.get(RegionState.State.FAILED_OPEN).size()
+ + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
+ int otherRegionsCount = 0;
+ for (List<HRegionInfo> list: tableRegions.values()) {
+ otherRegionsCount += list.size();
+ }
+ // now subtract known states
+ otherRegionsCount = otherRegionsCount - openRegionsCount
+ - failedRegionsCount - offlineRegionsCount
+ - splitRegionsCount;
+ </%java>
<tr>
<td><% htDesc.getTableName().getNamespaceAsString() %></td>
<td><a href=table.jsp?name=<% htDesc.getTableName().getNameAsString()
%>><% htDesc.getTableName().getQualifierAsString() %></a> </td>
<%if (frags != null) %>
<td align="center"><%
frags.get(htDesc.getTableName().getNameAsString()) != null ?
frags.get(htDesc.getTableName().getQualifierAsString()).intValue() + "%" :
"n/a" %></td>
</%if>
- <td><%
master.getAssignmentManager().getRegionStates().getRegionsOfTable(htDesc
- .getTableName()).size() %>
+ <td><% openRegionsCount %></td>
+ <td><% offlineRegionsCount %></td>
+ <td><% failedRegionsCount %></td>
+ <td><% splitRegionsCount %></td>
+ <td><% otherRegionsCount %></td>
<td><% htDesc.toStringCustomizedValues() %></td>
</tr>
</%for>
http://git-wip-us.apache.org/repos/asf/hbase/blob/afe33d1d/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
----------------------------------------------------------------------
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
index 303a38b..7c647f6 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
@@ -72,6 +72,12 @@ public class RegionStates {
private final HashMap<String, RegionState> regionStates;
/**
+ * Holds mapping of table -> region state
+ */
+ private final Map<TableName, Map<String, RegionState>>
regionStatesTableIndex =
+ new HashMap<TableName, Map<String, RegionState>>();
+
+ /**
* Server to regions assignment map.
* Contains the set of regions currently assigned to a given server.
*/
@@ -273,7 +279,7 @@ public class RegionStates {
+ "used existing: " + regionState + ", ignored new: " + newState);
} else {
regionState = new RegionState(hri, newState, serverName);
- regionStates.put(encodedName, regionState);
+ putRegionState(regionState);
if (newState == State.OPEN) {
regionAssignments.put(hri, serverName);
lastAssignments.put(encodedName, serverName);
@@ -290,6 +296,20 @@ public class RegionStates {
return regionState;
}
+ private RegionState putRegionState(RegionState regionState) {
+ HRegionInfo hri = regionState.getRegion();
+ String encodedName = hri.getEncodedName();
+ TableName table = hri.getTable();
+ RegionState oldState = regionStates.put(encodedName, regionState);
+ Map<String, RegionState> map = regionStatesTableIndex.get(table);
+ if (map == null) {
+ map = new HashMap<String, RegionState>();
+ regionStatesTableIndex.put(table, map);
+ }
+ map.put(encodedName, regionState);
+ return oldState;
+ }
+
/**
* Update a region state. It will be put in transition if not already there.
*/
@@ -587,6 +607,30 @@ public class RegionStates {
return tableRegions;
}
+ /**
+ * Gets current state of all regions of the table.
+ * This method looks at the in-memory state. It does not go to
<code>hbase:meta</code>.
+ * Method guaranteed to return keys for all states
+ * in {@link org.apache.hadoop.hbase.master.RegionState.State}
+ *
+ * @param tableName
+ * @return Online regions from <code>tableName</code>
+ */
+ public synchronized Map<RegionState.State, List<HRegionInfo>>
+ getRegionByStateOfTable(TableName tableName) {
+ Map<RegionState.State, List<HRegionInfo>> tableRegions =
+ new HashMap<State, List<HRegionInfo>>();
+ for (State state : State.values()) {
+ tableRegions.put(state, new ArrayList<HRegionInfo>());
+ }
+ Map<String, RegionState> indexMap = regionStatesTableIndex.get(tableName);
+ if (indexMap == null)
+ return tableRegions;
+ for (RegionState regionState : indexMap.values()) {
+ tableRegions.get(regionState.getState()).add(regionState.getRegion());
+ }
+ return tableRegions;
+ }
/**
* Wait on region to clear regions-in-transition.
@@ -848,7 +892,7 @@ public class RegionStates {
synchronized (this) {
regionsInTransition.put(encodedName, regionState);
- regionStates.put(encodedName, regionState);
+ putRegionState(regionState);
// For these states, region should be properly closed.
// There should be no log splitting issue.
http://git-wip-us.apache.org/repos/asf/hbase/blob/afe33d1d/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
----------------------------------------------------------------------
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
index 64be2bd..e40a32b 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
@@ -292,9 +292,9 @@ public class TestAssignmentManagerOnCluster {
long timeoutTime = System.currentTimeMillis() + 800;
while (true) {
- List<HRegionInfo> regions =
- regionStates.getRegionsOfTable(table);
- if (!regions.contains(hri)) break;
+ if (regionStates.getRegionByStateOfTable(table)
+ .get(RegionState.State.OFFLINE).contains(hri))
+ break;
long now = System.currentTimeMillis();
if (now > timeoutTime) {
fail("Failed to offline the region in time");