1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.io;
20
21 import org.apache.hadoop.conf.Configuration;
22 import org.apache.hadoop.fs.FSDataInputStream;
23 import org.apache.hadoop.fs.FSDataOutputStream;
24 import org.apache.hadoop.fs.FileSystem;
25 import org.apache.hadoop.fs.Path;
26 import org.apache.hadoop.hbase.HBaseTestingUtility;
27 import org.apache.hadoop.hbase.HRegionInfo;
28 import org.apache.hadoop.hbase.HTableDescriptor;
29 import org.apache.hadoop.hbase.MediumTests;
30 import org.apache.hadoop.hbase.SmallTests;
31 import org.apache.hadoop.hbase.TableName;
32 import org.apache.hadoop.hbase.regionserver.HRegion;
33 import org.apache.hadoop.hbase.util.Bytes;
34 import org.apache.hadoop.hbase.util.FSUtils;
35 import org.apache.hadoop.hbase.util.HFileArchiveUtil;
36 import org.apache.hadoop.hbase.util.Pair;
37 import org.apache.hadoop.hdfs.MiniDFSCluster;
38 import org.junit.Assert;
39 import org.junit.Test;
40 import org.junit.experimental.categories.Category;
41
42 import java.io.FileNotFoundException;
43 import java.io.IOException;
44 import java.util.ArrayList;
45 import java.util.List;
46 import java.util.regex.Matcher;
47
48 import static org.junit.Assert.assertEquals;
49 import static org.junit.Assert.assertFalse;
50 import static org.junit.Assert.assertTrue;
51
52
53
54
55
56 @Category(SmallTests.class)
57 public class TestHFileLink {
58
59 @Test
60 public void testValidLinkNames() {
61 String validLinkNames[] = {"foo=fefefe-0123456", "ns=foo=abababa-fefefefe"};
62
63 for(String name : validLinkNames) {
64 Assert.assertTrue("Failed validating:" + name, name.matches(HFileLink.LINK_NAME_REGEX));
65 }
66
67 for(String name : validLinkNames) {
68 Assert.assertTrue("Failed validating:" + name, HFileLink.isHFileLink(name));
69 }
70
71 String testName = "foo=fefefe-0123456";
72 Assert.assertEquals(TableName.valueOf("foo"),
73 HFileLink.getReferencedTableName(testName));
74 Assert.assertEquals("fefefe", HFileLink.getReferencedRegionName(testName));
75 Assert.assertEquals("0123456", HFileLink.getReferencedHFileName(testName));
76 Assert.assertEquals(testName,
77 HFileLink.createHFileLinkName(TableName.valueOf("foo"), "fefefe", "0123456"));
78
79 testName = "ns=foo=fefefe-0123456";
80 Assert.assertEquals(TableName.valueOf("ns", "foo"),
81 HFileLink.getReferencedTableName(testName));
82 Assert.assertEquals("fefefe", HFileLink.getReferencedRegionName(testName));
83 Assert.assertEquals("0123456", HFileLink.getReferencedHFileName(testName));
84 Assert.assertEquals(testName,
85 HFileLink.createHFileLinkName(TableName.valueOf("ns", "foo"), "fefefe", "0123456"));
86
87 for(String name : validLinkNames) {
88 Matcher m = HFileLink.LINK_NAME_PATTERN.matcher(name);
89 assertTrue(m.matches());
90 Assert.assertEquals(HFileLink.getReferencedTableName(name),
91 TableName.valueOf(m.group(1), m.group(2)));
92 Assert.assertEquals(HFileLink.getReferencedRegionName(name),
93 m.group(3));
94 Assert.assertEquals(HFileLink.getReferencedHFileName(name),
95 m.group(4));
96 }
97 }
98
99 @Test
100 public void testBackReference() {
101 Path rootDir = new Path("/root");
102 Path archiveDir = new Path(rootDir, ".archive");
103 String storeFileName = "121212";
104 String linkDir = FileLink.BACK_REFERENCES_DIRECTORY_PREFIX + storeFileName;
105 String encodedRegion = "FEFE";
106 String cf = "cf1";
107
108 TableName refTables[] = {TableName.valueOf("refTable"),
109 TableName.valueOf("ns", "refTable")};
110
111 for(TableName refTable : refTables) {
112 Path refTableDir = FSUtils.getTableDir(archiveDir, refTable);
113 Path refRegionDir = HRegion.getRegionDir(refTableDir, encodedRegion);
114 Path refDir = new Path(refRegionDir, cf);
115 Path refLinkDir = new Path(refDir, linkDir);
116 String refStoreFileName = refTable.getNameAsString().replace(
117 TableName.NAMESPACE_DELIM, '=') + "=" + encodedRegion + "-" + storeFileName;
118
119 TableName tableNames[] = {TableName.valueOf("tableName1"),
120 TableName.valueOf("ns", "tableName2")};
121
122 for( TableName tableName : tableNames) {
123 Path tableDir = FSUtils.getTableDir(rootDir, tableName);
124 Path regionDir = HRegion.getRegionDir(tableDir, encodedRegion);
125 Path cfDir = new Path(regionDir, cf);
126
127
128 assertEquals(encodedRegion+"."+
129 tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '='),
130 HFileLink.createBackReferenceName(tableName.getNameAsString(),
131 encodedRegion));
132
133
134 Pair<TableName, String> parsedRef =
135 HFileLink.parseBackReferenceName(encodedRegion+"."+
136 tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '='));
137 assertEquals(parsedRef.getFirst(), tableName);
138 assertEquals(parsedRef.getSecond(), encodedRegion);
139
140
141 Path storeFileDir = new Path(refLinkDir, encodedRegion+"."+
142 tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '='));
143 Path linkPath = new Path(cfDir, refStoreFileName);
144 assertEquals(linkPath, HFileLink.getHFileFromBackReference(rootDir, storeFileDir));
145 }
146 }
147 }
148
149
150 }