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