<%doc>

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.
</%doc>
<%import>
org.apache.hadoop.hbase.HRegionInfo;
org.apache.hadoop.hbase.master.AssignmentManager;
org.apache.hadoop.hbase.master.RegionState;
org.apache.hadoop.conf.Configuration;
org.apache.hadoop.hbase.HBaseConfiguration;
org.apache.hadoop.hbase.HConstants;
java.util.HashSet;
java.util.SortedSet;
java.util.Map;
java.util.concurrent.atomic.AtomicInteger;
</%import>
<%args>
AssignmentManager assignmentManager;
int limit = 100;
</%args>

<%java SortedSet<RegionState> rit = assignmentManager
  .getRegionStates().getRegionsInTransitionOrderedByTimestamp();
  Map<String, AtomicInteger> failedRegionTracker = assignmentManager.getFailedOpenTracker();
   %>

<%if !rit.isEmpty() %>
<%java>
HashSet<String> ritsOverThreshold = new HashSet<String>();
HashSet<String> ritsTwiceThreshold = new HashSet<String>();
// process the map to find region in transition details
Configuration conf = HBaseConfiguration.create();
int ritThreshold = conf.getInt(HConstants.METRICS_RIT_STUCK_WARNING_THRESHOLD, 60000);
int numOfRITOverThreshold = 0;
long currentTime = System.currentTimeMillis();
for (RegionState rs : rit) {
  long ritTime = currentTime - rs.getStamp();
  if(ritTime > (ritThreshold * 2)) {
     numOfRITOverThreshold++;
     ritsTwiceThreshold.add(rs.getRegion().getEncodedName());
  } else if (ritTime > ritThreshold) {
     numOfRITOverThreshold++;
     ritsOverThreshold.add(rs.getRegion().getEncodedName());
  }
}

int numOfRITs = rit.size();
int ritsPerPage = Math.min(5, numOfRITs);
int numOfPages = (int) Math.ceil(numOfRITs * 1.0 / ritsPerPage);
</%java>
    <section>
    <h2>Regions in Transition</h2>
     <p><% numOfRITs %> region(s) in transition.
     <%if !ritsTwiceThreshold.isEmpty()  %>
         <span class="label label-danger" style="font-size:100%;font-weight:normal">
     <%elseif !ritsOverThreshold.isEmpty() %>
         <span class="label label-warning" style="font-size:100%;font-weight:normal">
     <%else>
         <span>
     </%if>
         <% numOfRITOverThreshold %> region(s) in transition for
             more than <% ritThreshold %> milliseconds.
         </span>
     </p>
     <div class="tabbable">
         <div class="tab-content">
         <%java int recordItr = 0; %>
         <%for RegionState rs : rit %>
             <%if (recordItr % ritsPerPage) == 0 %>
                 <%if recordItr == 0 %>
             <div class="tab-pane active" id="tab_rits<% (recordItr / ritsPerPage) + 1 %>">
                 <%else>
             <div class="tab-pane" id="tab_rits<% (recordItr / ritsPerPage) + 1 %>">
                 </%if>
                 <table class="table table-striped" style="margin-bottom:0px;"><tr><th>Region</th>
                     <th>State</th><th>RIT time (ms)</th> <th>Retries </th></tr>
             </%if>

             <%if ritsOverThreshold.contains(rs.getRegion().getEncodedName()) %>
                     <tr class="alert alert-warning" role="alert">
             <%elseif ritsTwiceThreshold.contains(rs.getRegion().getEncodedName()) %>
                     <tr class="alert alert-danger" role="alert">
            <%else>
                    <tr>
            </%if>
                        <%java>
                          String retryStatus = "0";
                          AtomicInteger numOpenRetries = failedRegionTracker.get(
                              rs.getRegion().getEncodedName());
                          if (numOpenRetries != null ) {
                            retryStatus = Integer.toString(numOpenRetries.get());
                          } else if (rs.getState() ==  RegionState.State.FAILED_OPEN) {
                             retryStatus = "Failed";
                          }
                        </%java>
                        <td><% rs.getRegion().getEncodedName() %></td><td>
                        <% HRegionInfo.getDescriptiveNameFromRegionStateForDisplay(rs, conf) %></td>
                        <td><% (currentTime - rs.getStamp()) %> </td>
                        <td> <% retryStatus %> </td>
                     </tr>
                     <%java recordItr++; %>
             <%if (recordItr % ritsPerPage) == 0 %>
                 </table>
             </div>
         </%if>
         </%for>

         <%if (recordItr % ritsPerPage) != 0 %>
             <%for ; (recordItr % ritsPerPage) != 0 ; recordItr++ %>
             <tr><td colspan="3" style="height:61px"></td></tr>
             </%for>
                   </table>
             </div>
         </%if>
         </div>
         <nav>
             <ul class="nav nav-pills pagination">
             <%for int i = 1 ; i <= numOfPages; i++ %>
                 <%if i == 1 %>
                 <li class="active">
                 <%else>
                 <li>
                 </%if>
                 <a href="#tab_rits<% i %>"><% i %></a></li>
             </%for>
             </ul>
         </nav>
     </div>
   </section>
 </%if>

