1 /**
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package org.apache.hadoop.hbase.util;
19
20 import java.io.IOException;
21
22 import org.apache.hadoop.conf.Configuration;
23 import org.apache.hadoop.fs.FileSystem;
24 import org.apache.hadoop.fs.Path;
25 import org.apache.hadoop.hbase.TableName;
26 import org.apache.hadoop.hbase.HConstants;
27 import org.apache.hadoop.hbase.HRegionInfo;
28 import org.apache.hadoop.hbase.regionserver.HRegion;
29 import org.apache.hadoop.hbase.regionserver.HStore;
30
31 /**
32 * Helper class for all utilities related to archival/retrieval of HFiles
33 */
34 public class HFileArchiveUtil {
35 private HFileArchiveUtil() {
36 // non-external instantiation - util class
37 }
38
39 /**
40 * Get the directory to archive a store directory
41 * @param conf {@link Configuration} to read for the archive directory name
42 * @param tableName table name under which the store currently lives
43 * @param regionName region encoded name under which the store currently lives
44 * @param familyName name of the family in the store
45 * @return {@link Path} to the directory to archive the given store or
46 * <tt>null</tt> if it should not be archived
47 */
48 public static Path getStoreArchivePath(final Configuration conf,
49 final TableName tableName,
50 final String regionName, final String familyName) throws IOException {
51 Path tableArchiveDir = getTableArchivePath(conf, tableName);
52 return HStore.getStoreHomedir(tableArchiveDir, regionName, Bytes.toBytes(familyName));
53 }
54
55 /**
56 * Get the directory to archive a store directory
57 * @param conf {@link Configuration} to read for the archive directory name.
58 * @param region parent region information under which the store currently lives
59 * @param tabledir directory for the table under which the store currently lives
60 * @param family name of the family in the store
61 * @return {@link Path} to the directory to archive the given store or <tt>null</tt> if it should
62 * not be archived
63 */
64 public static Path getStoreArchivePath(Configuration conf,
65 HRegionInfo region,
66 Path tabledir,
67 byte[] family) throws IOException {
68 TableName tableName =
69 FSUtils.getTableName(tabledir);
70 Path rootDir = FSUtils.getRootDir(conf);
71 Path tableArchiveDir = getTableArchivePath(rootDir, tableName);
72 return HStore.getStoreHomedir(tableArchiveDir, region, family);
73 }
74
75 /**
76 * Get the archive directory for a given region under the specified table
77 * @param tableName the table name. Cannot be null.
78 * @param regiondir the path to the region directory. Cannot be null.
79 * @return {@link Path} to the directory to archive the given region, or <tt>null</tt> if it
80 * should not be archived
81 */
82 public static Path getRegionArchiveDir(Path rootDir,
83 TableName tableName,
84 Path regiondir) {
85 // get the archive directory for a table
86 Path archiveDir = getTableArchivePath(rootDir, tableName);
87
88 // then add on the region path under the archive
89 String encodedRegionName = regiondir.getName();
90 return HRegion.getRegionDir(archiveDir, encodedRegionName);
91 }
92
93 /**
94 * Get the archive directory for a given region under the specified table
95 * @param rootDir {@link Path} to the root directory where hbase files are stored (for building
96 * the archive path)
97 * @param tableName name of the table to archive. Cannot be null.
98 * @return {@link Path} to the directory to archive the given region, or <tt>null</tt> if it
99 * should not be archived
100 */
101 public static Path getRegionArchiveDir(Path rootDir,
102 TableName tableName, String encodedRegionName) {
103 // get the archive directory for a table
104 Path archiveDir = getTableArchivePath(rootDir, tableName);
105 return HRegion.getRegionDir(archiveDir, encodedRegionName);
106 }
107
108 /**
109 * Get the path to the table archive directory based on the configured archive directory.
110 * <p>
111 * Get the path to the table's archive directory.
112 * <p>
113 * Generally of the form: /hbase/.archive/[tablename]
114 * @param rootdir {@link Path} to the root directory where hbase files are stored (for building
115 * the archive path)
116 * @param tableName Name of the table to be archived. Cannot be null.
117 * @return {@link Path} to the archive directory for the table
118 */
119 public static Path getTableArchivePath(final Path rootdir, final TableName tableName) {
120 return FSUtils.getTableDir(getArchivePath(rootdir), tableName);
121 }
122
123 /**
124 * Get the path to the table archive directory based on the configured archive directory.
125 * <p>
126 * Assumed that the table should already be archived.
127 * @param conf {@link Configuration} to read the archive directory property. Can be null
128 * @param tableName Name of the table to be archived. Cannot be null.
129 * @return {@link Path} to the archive directory for the table
130 */
131 public static Path getTableArchivePath(final Configuration conf,
132 final TableName tableName)
133 throws IOException {
134 return FSUtils.getTableDir(getArchivePath(conf), tableName);
135 }
136
137 /**
138 * Get the full path to the archive directory on the configured {@link FileSystem}
139 * @param conf to look for archive directory name and root directory. Cannot be null. Notes for
140 * testing: requires a FileSystem root directory to be specified.
141 * @return the full {@link Path} to the archive directory, as defined by the configuration
142 * @throws IOException if an unexpected error occurs
143 */
144 public static Path getArchivePath(Configuration conf) throws IOException {
145 return getArchivePath(FSUtils.getRootDir(conf));
146 }
147
148 /**
149 * Get the full path to the archive directory on the configured {@link FileSystem}
150 * @param rootdir {@link Path} to the root directory where hbase files are stored (for building
151 * the archive path)
152 * @return the full {@link Path} to the archive directory, as defined by the configuration
153 */
154 private static Path getArchivePath(final Path rootdir) {
155 return new Path(rootdir, HConstants.HFILE_ARCHIVE_DIRECTORY);
156 }
157 }