Allan Yang created HBASE-20679:
----------------------------------

             Summary: Add the ability to compile JSP dynamically in Jetty
                 Key: HBASE-20679
                 URL: https://issues.apache.org/jira/browse/HBASE-20679
             Project: HBase
          Issue Type: New Feature
    Affects Versions: 2.0.0
            Reporter: Allan Yang
            Assignee: Allan Yang
             Fix For: 3.0.0


As discussed in HBASE-20617, adding the ability to dynamically compile jsp 
enable us to do some hot fix. 
 For example, several days ago, in our testing HBase-2.0 cluster, procedureWals 
were corrupted due to some unknown reasons. After restarting the cluster, since 
some procedures(AssignProcedure for example) were corrupted and couldn't be 
replayed. Some regions were stuck in RIT forever. We couldn't use HBCK since it 
haven't support AssignmentV2 yet. As a matter of fact, the namespace region was 
not online, so the master was not inited, we even couldn't use shell command 
like assign/move. But, we wrote a jsp and fix this issue easily. The jsp file 
is like this:
{code:java}
<%
  String action = request.getParameter("action");
  HMaster master = (HMaster)getServletContext().getAttribute(HMaster.MASTER);
  List<RegionInfo> offlineRegionsToAssign = new ArrayList<>();
  List<RegionStates.RegionStateNode> regionRITs = master.getAssignmentManager()
          .getRegionStates().getRegionsInTransition();
  for (RegionStates.RegionStateNode regionStateNode :  regionRITs) {
    // if regionStateNode don't have a procedure attached, but meta state shows
    // this region is in RIT, that means the previous procedure may be corrupted
    // we need to create a new assignProcedure to assign them
    if (!regionStateNode.isInTransition()) {
      offlineRegionsToAssign.add(regionStateNode.getRegionInfo());
      out.println("RIT region:" + regionStateNode);
    }
  }
  // Assign offline regions. Uses round-robin.
  if ("fix".equals(action) && offlineRegionsToAssign.size() > 0) {
    
master.getMasterProcedureExecutor().submitProcedures(master.getAssignmentManager().
            createRoundRobinAssignProcedures(offlineRegionsToAssign));
  } else {
    out.println("use ?action=fix to fix RIT regions");
  }
%>
{code}
Above it is only one example we can do if we have the ability to compile jsp 
dynamically. We think it is very useful.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to