View Javadoc

1   /**
2    *
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *     http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */
19  package org.apache.hadoop.hbase.master.handler;
20  
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  import org.apache.hadoop.classification.InterfaceAudience;
25  import org.apache.hadoop.hbase.HRegionInfo;
26  import org.apache.hadoop.hbase.Server;
27  import org.apache.hadoop.hbase.ServerName;
28  import org.apache.hadoop.hbase.executor.EventHandler;
29  import org.apache.hadoop.hbase.executor.EventType;
30  import org.apache.hadoop.hbase.master.AssignmentManager;
31  import org.apache.hadoop.hbase.master.RegionState;
32  import org.apache.hadoop.hbase.zookeeper.ZKAssign;
33  import org.apache.zookeeper.KeeperException;
34  
35  /**
36   * Handles OPENED region event on Master.
37   */
38  @InterfaceAudience.Private
39  public class OpenedRegionHandler extends EventHandler implements TotesHRegionInfo {
40    private static final Log LOG = LogFactory.getLog(OpenedRegionHandler.class);
41    private final AssignmentManager assignmentManager;
42    private final HRegionInfo regionInfo;
43    private final ServerName sn;
44    private final OpenedPriority priority;
45    private final int expectedVersion;
46  
47    private enum OpenedPriority {
48      META (1),
49      USER (2);
50  
51      private final int value;
52      OpenedPriority(int value) {
53        this.value = value;
54      }
55      public int getValue() {
56        return value;
57      }
58    };
59  
60    public OpenedRegionHandler(Server server,
61        AssignmentManager assignmentManager, HRegionInfo regionInfo,
62        ServerName sn, int expectedVersion) {
63      super(server, EventType.RS_ZK_REGION_OPENED);
64      this.assignmentManager = assignmentManager;
65      this.regionInfo = regionInfo;
66      this.sn = sn;
67      this.expectedVersion = expectedVersion;
68      if(regionInfo.isMetaRegion()) {
69        priority = OpenedPriority.META;
70      } else {
71        priority = OpenedPriority.USER;
72      }
73    }
74  
75    @Override
76    public int getPriority() {
77      return priority.getValue();
78    }
79  
80    @Override
81    public HRegionInfo getHRegionInfo() {
82      return this.regionInfo;
83    }
84    
85    @Override
86    public String toString() {
87      String name = "UnknownServerName";
88      if(server != null && server.getServerName() != null) {
89        name = server.getServerName().toString();
90      }
91      return getClass().getSimpleName() + "-" + name + "-" + getSeqid();
92    }
93  
94    @Override
95    public void process() {
96      // Code to defend against case where we get SPLIT before region open
97      // processing completes; temporary till we make SPLITs go via zk -- 0.92.
98      RegionState regionState = this.assignmentManager.getRegionStates()
99        .getRegionTransitionState(regionInfo.getEncodedName());
100     boolean openedNodeDeleted = false;
101     if (regionState != null && regionState.isOpened()) {
102       openedNodeDeleted = deleteOpenedNode(expectedVersion);
103       if (!openedNodeDeleted) {
104         LOG.error("The znode of region " + regionInfo.getRegionNameAsString()
105             + " could not be deleted.");
106       }
107     } else {
108       LOG.warn("Skipping the onlining of " + regionInfo.getRegionNameAsString() +
109         " because regions is NOT in RIT -- presuming this is because it SPLIT");
110     }
111     if (!openedNodeDeleted) {
112       if (this.assignmentManager.getZKTable().isDisablingOrDisabledTable(
113           regionInfo.getTableNameAsString())) {
114         debugLog(regionInfo, "Opened region "
115             + regionInfo.getRegionNameAsString() + " but "
116             + "this table is disabled, triggering close of region");
117         assignmentManager.unassign(regionInfo);
118       }
119     }
120   }
121 
122   private boolean deleteOpenedNode(int expectedVersion) {
123     debugLog(regionInfo, "Handling OPENED event for " +
124       this.regionInfo.getRegionNameAsString() + " from " + this.sn.toString() +
125       "; deleting unassigned node");
126     try {
127       // delete the opened znode only if the version matches.
128       return ZKAssign.deleteNode(server.getZooKeeper(),
129           regionInfo.getEncodedName(), EventType.RS_ZK_REGION_OPENED, expectedVersion);
130     } catch(KeeperException.NoNodeException e){
131       // Getting no node exception here means that already the region has been opened.
132       LOG.warn("The znode of the region " + regionInfo.getRegionNameAsString() +
133         " would have already been deleted");
134       return false;
135     } catch (KeeperException e) {
136       server.abort("Error deleting OPENED node in ZK (" +
137         regionInfo.getRegionNameAsString() + ")", e);
138     }
139     return false;
140   }
141 
142   private void debugLog(HRegionInfo region, String string) {
143     if (region.isMetaTable()) {
144       LOG.info(string);
145     } else {
146       LOG.debug(string);
147     }
148   }
149 }