/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hbase.io; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.testclassification.SmallTests; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.Pair; import org.junit.Assert; import org.junit.Test; import org.junit.experimental.categories.Category; import java.util.regex.Matcher; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * Test that FileLink switches between alternate locations * when the current location moves or gets deleted. */ @Category(SmallTests.class) public class TestHFileLink { @Test public void testValidLinkNames() { String validLinkNames[] = {"foo=fefefe-0123456", "ns=foo=abababa-fefefefe"}; for(String name : validLinkNames) { Assert.assertTrue("Failed validating:" + name, name.matches(HFileLink.LINK_NAME_REGEX)); } for(String name : validLinkNames) { Assert.assertTrue("Failed validating:" + name, HFileLink.isHFileLink(name)); } String testName = "foo=fefefe-0123456"; Assert.assertEquals(TableName.valueOf("foo"), HFileLink.getReferencedTableName(testName)); Assert.assertEquals("fefefe", HFileLink.getReferencedRegionName(testName)); Assert.assertEquals("0123456", HFileLink.getReferencedHFileName(testName)); Assert.assertEquals(testName, HFileLink.createHFileLinkName(TableName.valueOf("foo"), "fefefe", "0123456")); testName = "ns=foo=fefefe-0123456"; Assert.assertEquals(TableName.valueOf("ns", "foo"), HFileLink.getReferencedTableName(testName)); Assert.assertEquals("fefefe", HFileLink.getReferencedRegionName(testName)); Assert.assertEquals("0123456", HFileLink.getReferencedHFileName(testName)); Assert.assertEquals(testName, HFileLink.createHFileLinkName(TableName.valueOf("ns", "foo"), "fefefe", "0123456")); for(String name : validLinkNames) { Matcher m = HFileLink.LINK_NAME_PATTERN.matcher(name); assertTrue(m.matches()); Assert.assertEquals(HFileLink.getReferencedTableName(name), TableName.valueOf(m.group(1), m.group(2))); Assert.assertEquals(HFileLink.getReferencedRegionName(name), m.group(3)); Assert.assertEquals(HFileLink.getReferencedHFileName(name), m.group(4)); } } @Test public void testBackReference() { Path rootDir = new Path("/root"); Path archiveDir = new Path(rootDir, ".archive"); String storeFileName = "121212"; String linkDir = FileLink.BACK_REFERENCES_DIRECTORY_PREFIX + storeFileName; String encodedRegion = "FEFE"; String cf = "cf1"; TableName refTables[] = {TableName.valueOf("refTable"), TableName.valueOf("ns", "refTable")}; for(TableName refTable : refTables) { Path refTableDir = FSUtils.getTableDir(archiveDir, refTable); Path refRegionDir = HRegion.getRegionDir(refTableDir, encodedRegion); Path refDir = new Path(refRegionDir, cf); Path refLinkDir = new Path(refDir, linkDir); String refStoreFileName = refTable.getNameAsString().replace( TableName.NAMESPACE_DELIM, '=') + "=" + encodedRegion + "-" + storeFileName; TableName tableNames[] = {TableName.valueOf("tableName1"), TableName.valueOf("ns", "tableName2")}; for( TableName tableName : tableNames) { Path tableDir = FSUtils.getTableDir(rootDir, tableName); Path regionDir = HRegion.getRegionDir(tableDir, encodedRegion); Path cfDir = new Path(regionDir, cf); //Verify back reference creation assertEquals(encodedRegion+"."+ tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '='), HFileLink.createBackReferenceName(tableName.getNameAsString(), encodedRegion)); //verify parsing back reference Pair<TableName, String> parsedRef = HFileLink.parseBackReferenceName(encodedRegion+"."+ tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '=')); assertEquals(parsedRef.getFirst(), tableName); assertEquals(parsedRef.getSecond(), encodedRegion); //verify resolving back reference Path storeFileDir = new Path(refLinkDir, encodedRegion+"."+ tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '=')); Path linkPath = new Path(cfDir, refStoreFileName); assertEquals(linkPath, HFileLink.getHFileFromBackReference(rootDir, storeFileDir)); } } } }