001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.io; 019 020import static org.junit.jupiter.api.Assertions.assertEquals; 021import static org.junit.jupiter.api.Assertions.assertTrue; 022 023import java.util.regex.Matcher; 024import org.apache.hadoop.fs.Path; 025import org.apache.hadoop.hbase.TableName; 026import org.apache.hadoop.hbase.regionserver.HRegion; 027import org.apache.hadoop.hbase.testclassification.IOTests; 028import org.apache.hadoop.hbase.testclassification.SmallTests; 029import org.apache.hadoop.hbase.util.CommonFSUtils; 030import org.apache.hadoop.hbase.util.Pair; 031import org.junit.jupiter.api.Tag; 032import org.junit.jupiter.api.Test; 033import org.junit.jupiter.api.TestInfo; 034 035/** 036 * Test that FileLink switches between alternate locations when the current location moves or gets 037 * deleted. 038 */ 039@Tag(IOTests.TAG) 040@Tag(SmallTests.TAG) 041public class TestHFileLink { 042 043 @Test 044 public void testValidLinkNames(TestInfo testInfo) { 045 String validLinkNames[] = { "foo=fefefe-0123456", "ns=foo=abababa-fefefefe" }; 046 047 for (String name : validLinkNames) { 048 assertTrue(name.matches(HFileLink.LINK_NAME_REGEX), "Failed validating:" + name); 049 } 050 051 for (String name : validLinkNames) { 052 assertTrue(HFileLink.isHFileLink(name), "Failed validating:" + name); 053 } 054 055 String testName = testInfo.getTestMethod().get().getName() + "=fefefe-0123456"; 056 assertEquals(TableName.valueOf(testInfo.getTestMethod().get().getName()), 057 HFileLink.getReferencedTableName(testName)); 058 assertEquals("fefefe", HFileLink.getReferencedRegionName(testName)); 059 assertEquals("0123456", HFileLink.getReferencedHFileName(testName)); 060 assertEquals(testName, HFileLink.createHFileLinkName( 061 TableName.valueOf(testInfo.getTestMethod().get().getName()), "fefefe", "0123456")); 062 063 testName = "ns=" + testInfo.getTestMethod().get().getName() + "=fefefe-0123456"; 064 assertEquals(TableName.valueOf("ns", testInfo.getTestMethod().get().getName()), 065 HFileLink.getReferencedTableName(testName)); 066 assertEquals("fefefe", HFileLink.getReferencedRegionName(testName)); 067 assertEquals("0123456", HFileLink.getReferencedHFileName(testName)); 068 assertEquals(testName, HFileLink.createHFileLinkName( 069 TableName.valueOf("ns", testInfo.getTestMethod().get().getName()), "fefefe", "0123456")); 070 071 for (String name : validLinkNames) { 072 Matcher m = HFileLink.LINK_NAME_PATTERN.matcher(name); 073 assertTrue(m.matches()); 074 assertEquals(HFileLink.getReferencedTableName(name), 075 TableName.valueOf(m.group(1), m.group(2))); 076 assertEquals(HFileLink.getReferencedRegionName(name), m.group(3)); 077 assertEquals(HFileLink.getReferencedHFileName(name), m.group(4)); 078 } 079 } 080 081 @Test 082 public void testBackReference(TestInfo testInfo) { 083 Path rootDir = new Path("/root"); 084 Path archiveDir = new Path(rootDir, ".archive"); 085 String storeFileName = "121212"; 086 String linkDir = FileLink.BACK_REFERENCES_DIRECTORY_PREFIX + storeFileName; 087 String encodedRegion = "FEFE"; 088 String cf = "cf1"; 089 090 TableName refTables[] = { TableName.valueOf(testInfo.getTestMethod().get().getName()), 091 TableName.valueOf("ns", testInfo.getTestMethod().get().getName()) }; 092 093 for (TableName refTable : refTables) { 094 Path refTableDir = CommonFSUtils.getTableDir(archiveDir, refTable); 095 Path refRegionDir = HRegion.getRegionDir(refTableDir, encodedRegion); 096 Path refDir = new Path(refRegionDir, cf); 097 Path refLinkDir = new Path(refDir, linkDir); 098 String refStoreFileName = refTable.getNameAsString().replace(TableName.NAMESPACE_DELIM, '=') 099 + "=" + encodedRegion + "-" + storeFileName; 100 101 TableName tableNames[] = { TableName.valueOf(testInfo.getTestMethod().get().getName() + "1"), 102 TableName.valueOf("ns", testInfo.getTestMethod().get().getName() + "2"), 103 TableName.valueOf(testInfo.getTestMethod().get().getName() + ":" 104 + testInfo.getTestMethod().get().getName()) }; 105 106 for (TableName tableName : tableNames) { 107 Path tableDir = CommonFSUtils.getTableDir(rootDir, tableName); 108 Path regionDir = HRegion.getRegionDir(tableDir, encodedRegion); 109 Path cfDir = new Path(regionDir, cf); 110 111 assertEquals( 112 encodedRegion + "." + tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '='), 113 HFileLink.createBackReferenceName(CommonFSUtils.getTableName(tableDir).getNameAsString(), 114 encodedRegion)); 115 116 Pair<TableName, String> parsedRef = HFileLink.parseBackReferenceName(encodedRegion + "." 117 + tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '=')); 118 assertEquals(parsedRef.getFirst(), tableName); 119 assertEquals(encodedRegion, parsedRef.getSecond()); 120 121 Path storeFileDir = new Path(refLinkDir, encodedRegion + "." 122 + tableName.getNameAsString().replace(TableName.NAMESPACE_DELIM, '=')); 123 Path linkPath = new Path(cfDir, refStoreFileName); 124 assertEquals(linkPath, HFileLink.getHFileFromBackReference(rootDir, storeFileDir)); 125 } 126 } 127 } 128 129}