Author: todd
Date: Fri Sep  2 20:24:48 2011
New Revision: 1164690

URL: http://svn.apache.org/viewvc?rev=1164690&view=rev
Log:
HBASE-4257  Limit the number of regions in transitions displayed on master 
webpage.

Modified:
    hbase/trunk/CHANGES.txt
    
hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon
    
hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java

Modified: hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1164690&r1=1164689&r2=1164690&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Sep  2 20:24:48 2011
@@ -434,6 +434,8 @@ Release 0.91.0 - Unreleased
    HBASE-4275  RS should communicate fatal "aborts" back to the master (todd)
    HBASE-4263  New config property for user-table only RegionObservers
                (Lars Hofhansl)
+   HBASE-4257  Limit the number of regions in transitions displayed on
+               master webpage. (todd)
 
   TASKS
    HBASE-3559  Move report of split to master OFF the heartbeat channel

Modified: 
hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon?rev=1164690&r1=1164689&r2=1164690&view=diff
==============================================================================
--- 
hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon
 (original)
+++ 
hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon
 Fri Sep  2 20:24:48 2011
@@ -18,15 +18,40 @@ See the License for the specific languag
 limitations under the License.
 </%doc>
 <%import>
+org.apache.hadoop.hbase.HRegionInfo;
 org.apache.hadoop.hbase.master.AssignmentManager;
 org.apache.hadoop.hbase.master.AssignmentManager.RegionState;
+java.util.Iterator;
 java.util.Map;
 </%import>
 <%args>
 AssignmentManager assignmentManager;
+int limit = 100;
 </%args>
 <%java>
 Map<String, RegionState> rit = assignmentManager.getRegionsInTransition();
+
+int toRemove = rit.size() - limit;
+int removed = 0;
+if (toRemove > 0) {
+  // getRegionsInTransition returned a copy, so we can mutate it
+  for (Iterator<Map.Entry<String, RegionState>> it = rit.entrySet().iterator();
+       it.hasNext() && toRemove > 0;
+       ) {
+    Map.Entry<String, RegionState> e = it.next();
+    if (HRegionInfo.FIRST_META_REGIONINFO.getEncodedName().equals(
+          e.getKey()) ||
+        HRegionInfo.ROOT_REGIONINFO.getEncodedName().equals(
+          e.getKey())) {
+      // don't remove the meta regions, they're too interesting!
+      continue;
+    } 
+    it.remove();
+    toRemove--;
+    removed++;
+  }
+}
+
 </%java>
 
 <h2>Regions in Transition</h2>
@@ -39,4 +64,7 @@ No regions in transition.
                <tr><td><% entry.getKey() %></td><td><% 
entry.getValue().toDescriptiveString() %></td>
                </%for>
        </table>
+       <%if removed > 0 %>
+       (<% removed %> more regions in transition not shown) 
+       </%if>
 </%if>
\ No newline at end of file

Modified: 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java?rev=1164690&r1=1164689&r2=1164690&view=diff
==============================================================================
--- 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java
 (original)
+++ 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java
 Fri Sep  2 20:24:48 2011
@@ -19,10 +19,14 @@
  */
 package org.apache.hadoop.hbase.master;
 
+import static org.junit.Assert.*;
+
 import java.io.IOException;
 import java.io.StringWriter;
 import java.util.List;
 import java.util.NavigableMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.*;
@@ -33,6 +37,7 @@ import org.apache.hadoop.hbase.master.Se
 import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
+import org.apache.hbase.tmpl.master.AssignmentManagerStatusTmpl;
 import org.apache.hbase.tmpl.master.MasterStatusTmpl;
 import org.junit.Before;
 import org.junit.Test;
@@ -57,17 +62,8 @@ public class TestMasterStatusServlet {
   static final HRegionInfo FAKE_HRI =
       new HRegionInfo(FAKE_TABLE.getName(), Bytes.toBytes("a"), 
Bytes.toBytes("b"));
 
- // static final HRegionInfo FAKE_REGION = null;
-
   @Before
   public void setupBasicMocks() {
-    try {
-       HRegion.createHRegion(FAKE_HRI, HBaseTestingUtility.getTestDir(),
-          HBaseConfiguration.create(), FAKE_TABLE);
-    } catch(IOException ioe) {
-
-    }
-
     conf = HBaseConfiguration.create();
     
     master = Mockito.mock(HMaster.class);
@@ -146,5 +142,43 @@ public class TestMasterStatusServlet {
       .render(new StringWriter(),
         master, admin);
   }
+  
+  @Test
+  public void testAssignmentManagerTruncatedList() throws IOException {
+    AssignmentManager am = Mockito.mock(AssignmentManager.class);
+    
+    // Add 100 regions as in-transition
+    NavigableMap<String, RegionState> regionsInTransition =
+      Maps.newTreeMap();
+    for (byte i = 0; i < 100; i++) {
+      HRegionInfo hri = new HRegionInfo(FAKE_TABLE.getName(),
+          new byte[]{i}, new byte[]{(byte) (i+1)});
+      regionsInTransition.put(hri.getEncodedName(),
+          new RegionState(hri, RegionState.State.CLOSING, 12345L, FAKE_HOST));
+    }
+    // Add META in transition as well
+    regionsInTransition.put(
+        HRegionInfo.FIRST_META_REGIONINFO.getEncodedName(),
+        new RegionState(HRegionInfo.FIRST_META_REGIONINFO,
+                        RegionState.State.CLOSING, 12345L, FAKE_HOST));
+    Mockito.doReturn(regionsInTransition).when(am).getRegionsInTransition();
 
+    // Render to a string
+    StringWriter sw = new StringWriter();
+    new AssignmentManagerStatusTmpl()
+      .setLimit(50)
+      .render(sw, am);
+    String result = sw.toString();
+
+    // Should always include META
+    
assertTrue(result.contains(HRegionInfo.FIRST_META_REGIONINFO.getEncodedName()));
+    
+    // Make sure we only see 50 of them
+    Matcher matcher = Pattern.compile("CLOSING").matcher(result);
+    int count = 0;
+    while (matcher.find()) {
+      count++;
+    }
+    assertEquals(50, count);
+  }
 }


Reply via email to