diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java index 9bb07bb..eda5fd4 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java @@ -87,6 +87,9 @@ public abstract class FSUtils { /** Full access permissions (starting point for a umask) */ private static final String FULL_RWX_PERMISSIONS = "777"; + /** Set to true on Windows platforms */ + public static final boolean WINDOWS = System.getProperty("os.name").startsWith("Windows"); + protected FSUtils() { super(); } @@ -95,7 +98,7 @@ public abstract class FSUtils { * Compare of path component. Does not consider schema; i.e. if schemas different but path * starts with rootPath, then the function returns true * @param rootPath - * @param path + * @param path * @return True if path starts with rootPath */ public static boolean isStartingWithPath(final Path rootPath, final String path) { @@ -404,7 +407,7 @@ public abstract class FSUtils { /** * We use reflection because {@link DistributedFileSystem#setSafeMode( * FSConstants.SafeModeAction action, boolean isChecked)} is not in hadoop 1.1 - * + * * @param dfs * @return whether we're in safe mode * @throws IOException @@ -418,14 +421,14 @@ public abstract class FSUtils { org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction.SAFEMODE_GET, true); } catch (Exception e) { if (e instanceof IOException) throw (IOException) e; - + // Check whether dfs is on safemode. inSafeMode = dfs.setSafeMode( - org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction.SAFEMODE_GET); + org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction.SAFEMODE_GET); } - return inSafeMode; + return inSafeMode; } - + /** * Check whether dfs is in safemode. * @param conf @@ -458,7 +461,7 @@ public abstract class FSUtils { Path versionFile = new Path(rootdir, HConstants.VERSION_FILE_NAME); FileStatus[] status = null; try { - // hadoop 2.0 throws FNFE if directory does not exist. + // hadoop 2.0 throws FNFE if directory does not exist. // hadoop 1.0 returns null if directory does not exist. status = fs.listStatus(versionFile); } catch (FileNotFoundException fnfe) { @@ -1446,7 +1449,7 @@ public abstract class FSUtils { * @return Map keyed by StoreFile name with a value of the full Path. * @throws IOException When scanning the directory fails. */ - public static Map getTableStoreFilePathMap(Map map, + public static Map getTableStoreFilePathMap(Map map, final FileSystem fs, final Path hbaseRootDir, byte[] tablename) throws IOException { if (map == null) { @@ -1456,7 +1459,7 @@ public abstract class FSUtils { // only include the directory paths to tables Path tableDir = new Path(hbaseRootDir, Bytes.toString(tablename)); // Inside a table, there are compaction.dir directories to skip. Otherwise, all else - // should be regions. + // should be regions. PathFilter df = new BlackListDirFilter(fs, HConstants.HBASE_NON_TABLE_DIRS); FileStatus[] regionDirs = fs.listStatus(tableDir); for (FileStatus regionDir : regionDirs) { @@ -1480,7 +1483,7 @@ public abstract class FSUtils { return map; } - + /** * Runs through the HBase rootdir and creates a reverse lookup map for * table StoreFile names to the full Path. @@ -1501,7 +1504,7 @@ public abstract class FSUtils { // if this method looks similar to 'getTableFragmentation' that is because // it was borrowed from it. - + // only include the directory paths to tables PathFilter df = new BlackListDirFilter(fs, HConstants.HBASE_NON_TABLE_DIRS); FileStatus [] tableDirs = fs.listStatus(hbaseRootDir, df); diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java index 88310ef..b40a849 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java @@ -22,26 +22,22 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import org.junit.Test; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import junit.framework.TestCase; -import org.junit.experimental.categories.Category; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; -import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.MediumTests; -import org.apache.hadoop.hbase.io.FileLink; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import org.apache.hadoop.hbase.util.FSUtils; +import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Test that FileLink switches between alternate locations @@ -108,12 +104,21 @@ public class TestFileLink { dataVerify(data, n, (byte)2); size += n; + if (FSUtils.WINDOWS) { + in.close(); + } + // Move origin to archive assertFalse(fs.exists(archivedPath)); fs.rename(originalPath, archivedPath); assertFalse(fs.exists(originalPath)); assertTrue(fs.exists(archivedPath)); + if (FSUtils.WINDOWS) { + in = link.open(fs); // re-read from beginning + in.read(data); + } + // Try to read to the end while ((n = in.read(data)) > 0) { dataVerify(data, n, (byte)2);