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  
20  package org.apache.hadoop.hbase.util;
21  
22  import java.io.IOException;
23  import java.util.Collections;
24  import java.util.Map;
25  import java.util.TreeMap;
26  
27  import org.apache.commons.logging.Log;
28  import org.apache.commons.logging.LogFactory;
29  import org.apache.hadoop.classification.InterfaceAudience;
30  import org.apache.hadoop.conf.Configuration;
31  import org.apache.hadoop.fs.FileSystem;
32  import org.apache.hadoop.hbase.HBaseConfiguration;
33  import org.apache.hadoop.hbase.HConstants;
34  import org.apache.hadoop.hbase.HRegionInfo;
35  import org.apache.hadoop.hbase.HTableDescriptor;
36  import org.apache.hadoop.hbase.regionserver.HRegion;
37  import org.apache.hadoop.hbase.regionserver.wal.HLog;
38  import org.apache.hadoop.hbase.regionserver.wal.HLogFactory;
39  
40  /**
41   * Contains utility methods for manipulating HBase meta tables.
42   * Be sure to call {@link #shutdown()} when done with this class so it closes
43   * resources opened during meta processing (ROOT, META, etc.).  Be careful
44   * how you use this class.  If used during migrations, be careful when using
45   * this class to check whether migration is needed.
46   */
47  @InterfaceAudience.Private
48  public class MetaUtils {
49    private static final Log LOG = LogFactory.getLog(MetaUtils.class);
50    private final Configuration conf;
51    private FileSystem fs;
52    private HLog log;
53    private HRegion metaRegion;
54    private Map<byte [], HRegion> metaRegions = Collections.synchronizedSortedMap(
55      new TreeMap<byte [], HRegion>(Bytes.BYTES_COMPARATOR));
56  
57    /** Default constructor
58     * @throws IOException e
59     */
60    public MetaUtils() throws IOException {
61      this(HBaseConfiguration.create());
62    }
63  
64    /**
65     * @param conf Configuration
66     * @throws IOException e
67     */
68    public MetaUtils(Configuration conf) throws IOException {
69      this.conf = conf;
70      conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);
71      this.metaRegion = null;
72      initialize();
73    }
74  
75    /**
76     * Verifies that DFS is available and that HBase is off-line.
77     * @throws IOException e
78     */
79    private void initialize() throws IOException {
80      this.fs = FileSystem.get(this.conf);
81    }
82  
83    /**
84     * @return the HLog
85     * @throws IOException e
86     */
87    public synchronized HLog getLog() throws IOException {
88      if (this.log == null) {
89        String logName = 
90            HConstants.HREGION_LOGDIR_NAME + "_" + System.currentTimeMillis();
91        this.log = HLogFactory.createHLog(this.fs, this.fs.getHomeDirectory(),
92                                          logName, this.conf);
93      }
94      return this.log;
95    }
96  
97    /**
98     * @return HRegion for meta region
99     * @throws IOException e
100    */
101   public HRegion getMetaRegion() throws IOException {
102     if (this.metaRegion == null) {
103       openMetaRegion();
104     }
105     return this.metaRegion;
106   }
107 
108   /**
109    * Closes catalog regions if open. Also closes and deletes the HLog. You
110    * must call this method if you want to persist changes made during a
111    * MetaUtils edit session.
112    */
113   public void shutdown() {
114     if (this.metaRegion != null) {
115       try {
116         this.metaRegion.close();
117       } catch (IOException e) {
118         LOG.error("closing meta region", e);
119       } finally {
120         this.metaRegion = null;
121       }
122     }
123     try {
124       for (HRegion r: metaRegions.values()) {
125         LOG.info("CLOSING hbase:meta " + r.toString());
126         r.close();
127       }
128     } catch (IOException e) {
129       LOG.error("closing meta region", e);
130     } finally {
131       metaRegions.clear();
132     }
133     try {
134       if (this.log != null) {
135         this.log.rollWriter();
136         this.log.closeAndDelete();
137       }
138     } catch (IOException e) {
139       LOG.error("closing HLog", e);
140     } finally {
141       this.log = null;
142     }
143   }
144 
145   private synchronized HRegion openMetaRegion() throws IOException {
146     if (this.metaRegion != null) {
147       return this.metaRegion;
148     }
149     this.metaRegion = HRegion.openHRegion(HRegionInfo.FIRST_META_REGIONINFO,
150       HTableDescriptor.META_TABLEDESC, getLog(),
151       this.conf);
152     this.metaRegion.compactStores();
153     return this.metaRegion;
154   }
155 }