diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java index 3b6dd366c88..d26bd81e4ed 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java @@ -24,7 +24,6 @@ import java.io.DataInputStream; import java.io.EOFException; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; import java.io.InterruptedIOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -34,7 +33,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -49,6 +47,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +import org.apache.commons.lang3.ArrayUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FSDataInputStream; @@ -137,20 +136,26 @@ public abstract class FSUtils extends CommonFSUtils { * @return True if pathTail is tail on the path of pathToSearch */ public static boolean isMatchingTail(final Path pathToSearch, final Path pathTail) { - if (pathToSearch.depth() != pathTail.depth()) return false; Path tailPath = pathTail; String tailName; Path toSearch = pathToSearch; String toSearchName; boolean result = false; + + if (pathToSearch.depth() != pathTail.depth()) { + return false; + } + do { tailName = tailPath.getName(); - if (tailName == null || tailName.length() <= 0) { + if (tailName == null || tailName.isEmpty()) { result = true; break; } toSearchName = toSearch.getName(); - if (toSearchName == null || toSearchName.length() <= 0) break; + if (toSearchName == null || toSearchName.isEmpty()) { + break; + } // Move up a parent on each path for next go around. Path doesn't let us go off the end. tailPath = tailPath.getParent(); toSearch = toSearch.getParent(); @@ -226,12 +231,8 @@ public abstract class FSUtils extends CommonFSUtils { throw new IOException(ite.getCause()); } catch (NoSuchMethodException e) { LOG.debug("DFS Client does not support most favored nodes create; using default create"); - if (LOG.isTraceEnabled()) LOG.trace("Ignoring; use default create", e); - } catch (IllegalArgumentException e) { - LOG.debug("Ignoring (most likely Reflection related exception) " + e); - } catch (SecurityException e) { - LOG.debug("Ignoring (most likely Reflection related exception) " + e); - } catch (IllegalAccessException e) { + LOG.trace("Ignoring; use default create", e); + } catch (IllegalArgumentException | SecurityException | IllegalAccessException e) { LOG.debug("Ignoring (most likely Reflection related exception) " + e); } } @@ -316,13 +317,13 @@ public abstract class FSUtils extends CommonFSUtils { * * @param fs filesystem object * @param rootdir root hbase directory - * @return null if no version file exists, version string otherwise. - * @throws IOException e - * @throws org.apache.hadoop.hbase.exceptions.DeserializationException + * @return null if no version file exists, version string otherwise + * @throws IOException if the version file fails to open + * @throws DeserializationException if the version data cannot be translated into a version */ public static String getVersion(FileSystem fs, Path rootdir) throws IOException, DeserializationException { - Path versionFile = new Path(rootdir, HConstants.VERSION_FILE_NAME); + final Path versionFile = new Path(rootdir, HConstants.VERSION_FILE_NAME); FileStatus[] status = null; try { // hadoop 2.0 throws FNFE if directory does not exist. @@ -331,7 +332,9 @@ public abstract class FSUtils extends CommonFSUtils { } catch (FileNotFoundException fnfe) { return null; } - if (status == null || status.length == 0) return null; + if (ArrayUtils.getLength(status) == 0) { + return null; + } String version = null; byte [] content = new byte [(int)status[0].getLen()]; FSDataInputStream s = fs.open(versionFile); @@ -341,12 +344,8 @@ public abstract class FSUtils extends CommonFSUtils { version = parseVersionFrom(content); } else { // Presume it pre-pb format. - InputStream is = new ByteArrayInputStream(content); - DataInputStream dis = new DataInputStream(is); - try { + try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(content))) { version = dis.readUTF(); - } finally { - dis.close(); } } } catch (EOFException eof) { @@ -359,9 +358,9 @@ public abstract class FSUtils extends CommonFSUtils { /** * Parse the content of the ${HBASE_ROOTDIR}/hbase.version file. - * @param bytes The byte content of the hbase.version file. - * @return The version found in the file as a String. - * @throws DeserializationException + * @param bytes The byte content of the hbase.version file + * @return The version found in the file as a String + * @throws DeserializationException if the version data cannot be translated into a version */ static String parseVersionFrom(final byte [] bytes) throws DeserializationException { @@ -395,9 +394,8 @@ public abstract class FSUtils extends CommonFSUtils { * @param fs file system * @param rootdir root directory of HBase installation * @param message if true, issues a message on System.out - * - * @throws IOException e - * @throws DeserializationException + * @throws IOException if the version file cannot be opened + * @throws DeserializationException if the contents of the version file cannot be parsed */ public static void checkVersion(FileSystem fs, Path rootdir, boolean message) throws IOException, DeserializationException { @@ -413,8 +411,8 @@ public abstract class FSUtils extends CommonFSUtils { * @param wait wait interval * @param retries number of times to retry * - * @throws IOException e - * @throws DeserializationException + * @throws IOException if the version file cannot be opened + * @throws DeserializationException if the contents of the version file cannot be parsed */ public static void checkVersion(FileSystem fs, Path rootdir, boolean message, int wait, int retries) @@ -545,19 +543,19 @@ public abstract class FSUtils extends CommonFSUtils { * @throws IOException if checking the FileSystem fails */ public static boolean checkClusterIdExists(FileSystem fs, Path rootdir, - int wait) throws IOException { + long wait) throws IOException { while (true) { try { Path filePath = new Path(rootdir, HConstants.CLUSTER_ID_FILE_NAME); return fs.exists(filePath); } catch (IOException ioe) { - if (wait > 0) { - LOG.warn("Unable to check cluster ID file in " + rootdir.toString() + - ", retrying in "+wait+"msec: "+StringUtils.stringifyException(ioe)); + if (wait > 0L) { + LOG.warn("Unable to check cluster ID file in {}, retrying in {}ms", rootdir, wait, ioe); try { Thread.sleep(wait); } catch (InterruptedException e) { - throw (InterruptedIOException)new InterruptedIOException().initCause(e); + Thread.currentThread().interrupt(); + throw (InterruptedIOException) new InterruptedIOException().initCause(e); } } else { throw ioe; @@ -585,7 +583,7 @@ public abstract class FSUtils extends CommonFSUtils { try { in.readFully(content); } catch (EOFException eof) { - LOG.warn("Cluster ID file " + idPath.toString() + " was empty"); + LOG.warn("Cluster ID file {} is empty", idPath); } finally{ in.close(); } @@ -602,7 +600,7 @@ public abstract class FSUtils extends CommonFSUtils { cid = in.readUTF(); clusterId = new ClusterId(cid); } catch (EOFException eof) { - LOG.warn("Cluster ID file " + idPath.toString() + " was empty"); + LOG.warn("Cluster ID file {} is empty", idPath); } finally { in.close(); } @@ -610,7 +608,7 @@ public abstract class FSUtils extends CommonFSUtils { } return clusterId; } else { - LOG.warn("Cluster ID file does not exist at " + idPath.toString()); + LOG.warn("Cluster ID file does not exist at {}", idPath); } return clusterId; } @@ -704,7 +702,8 @@ public abstract class FSUtils extends CommonFSUtils { try { Thread.sleep(wait); } catch (InterruptedException e) { - throw (InterruptedIOException)new InterruptedIOException().initCause(e); + Thread.currentThread().interrupt(); + throw (InterruptedIOException) new InterruptedIOException().initCause(e); } } } @@ -763,14 +762,14 @@ public abstract class FSUtils extends CommonFSUtils { * Returns the total overall fragmentation percentage. Includes hbase:meta and * -ROOT- as well. * - * @param master The master defining the HBase root and file system. - * @return A map for each table and its percentage. - * @throws IOException When scanning the directory fails. + * @param master The master defining the HBase root and file system + * @return A map for each table and its percentage (never null) + * @throws IOException When scanning the directory fails */ public static int getTotalTableFragmentation(final HMaster master) throws IOException { Map map = getTableFragmentation(master); - return map != null && map.size() > 0 ? map.get("-TOTAL-") : -1; + return map.isEmpty() ? -1 : map.get("-TOTAL-"); } /** @@ -779,7 +778,7 @@ public abstract class FSUtils extends CommonFSUtils { * percentage across all tables is stored under the special key "-TOTAL-". * * @param master The master defining the HBase root and file system. - * @return A map for each table and its percentage. + * @return A map for each table and its percentage (never null). * * @throws IOException When scanning the directory fails. */ @@ -797,10 +796,10 @@ public abstract class FSUtils extends CommonFSUtils { * have more than one file in them. Checks -ROOT- and hbase:meta too. The total * percentage across all tables is stored under the special key "-TOTAL-". * - * @param fs The file system to use. - * @param hbaseRootDir The root directory to scan. - * @return A map for each table and its percentage. - * @throws IOException When scanning the directory fails. + * @param fs The file system to use + * @param hbaseRootDir The root directory to scan + * @return A map for each table and its percentage (never null) + * @throws IOException When scanning the directory fails */ public static Map getTableFragmentation( final FileSystem fs, final Path hbaseRootDir) @@ -865,7 +864,7 @@ public abstract class FSUtils extends CommonFSUtils { try { return isFile(fs, isDir, p); } catch (IOException e) { - LOG.warn("unable to verify if path=" + p + " is a regular file", e); + LOG.warn("Unable to verify if path={} is a regular file", p, e); return false; } } @@ -901,8 +900,8 @@ public abstract class FSUtils extends CommonFSUtils { try { return isDirectory(fs, isDir, p); } catch (IOException e) { - LOG.warn("An error occurred while verifying if [" + p.toString() - + "] is a valid directory. Returning 'not valid' and continuing.", e); + LOG.warn("An error occurred while verifying if [{}] is a valid directory." + + " Returning 'not valid' and continuing.", p, e); return false; } } @@ -939,7 +938,7 @@ public abstract class FSUtils extends CommonFSUtils { try { TableName.isLegalTableQualifierName(Bytes.toBytes(name)); } catch (IllegalArgumentException e) { - LOG.info("INVALID NAME " + name); + LOG.info("Invalid table name: {}", name); return false; } return true; @@ -964,11 +963,10 @@ public abstract class FSUtils extends CommonFSUtils { public static List getTableDirs(final FileSystem fs, final Path rootdir) throws IOException { - List tableDirs = new LinkedList<>(); + List tableDirs = new ArrayList<>(); - for(FileStatus status : - fs.globStatus(new Path(rootdir, - new Path(HConstants.BASE_NAMESPACE_DIR, "*")))) { + for (FileStatus status : fs + .globStatus(new Path(rootdir, new Path(HConstants.BASE_NAMESPACE_DIR, "*")))) { tableDirs.addAll(FSUtils.getLocalTableDirs(fs, status.getPath())); } return tableDirs; @@ -1014,7 +1012,7 @@ public abstract class FSUtils extends CommonFSUtils { return isDirectory(fs, isDir, p); } catch (IOException ioe) { // Maybe the file was moved or the fs was disconnected. - LOG.warn("Skipping file " + p +" due to IOException", ioe); + LOG.warn("Skipping file {} due to IOException", p, ioe); return false; } } @@ -1075,7 +1073,7 @@ public abstract class FSUtils extends CommonFSUtils { return isDirectory(fs, isDir, p); } catch (IOException ioe) { // Maybe the file was moved or the fs was disconnected. - LOG.warn("Skipping file " + p +" due to IOException", ioe); + LOG.warn("Skipping file {} due to IOException", p, ioe); return false; } } @@ -1133,7 +1131,7 @@ public abstract class FSUtils extends CommonFSUtils { return isFile(fs, isDir, p); } catch (IOException ioe) { // Maybe the file was moved or the fs was disconnected. - LOG.warn("Skipping file " + p +" due to IOException", ioe); + LOG.warn("Skipping file {} due to IOException", p, ioe); return false; } } @@ -1170,7 +1168,7 @@ public abstract class FSUtils extends CommonFSUtils { return isFile(fs, isDir, p); } catch (IOException ioe) { // Maybe the file was moved or the fs was disconnected. - LOG.warn("Skipping file " + p +" due to IOException", ioe); + LOG.warn("Skipping file {} due to IOException", p, ioe); return false; } } @@ -1248,7 +1246,7 @@ public abstract class FSUtils extends CommonFSUtils { }); } - /* + /** * Runs through the HBase rootdir/tablename and creates a reverse lookup map for * table StoreFile names to the full Path. Note that because this method can be called * on a 'live' HBase system that we will skip files that no longer exist by the time @@ -1270,7 +1268,7 @@ public abstract class FSUtils extends CommonFSUtils { * family dir and for each store file. * @return Map keyed by StoreFile name with a value of the full Path. * @throws IOException When scanning the directory fails. - * @throws InterruptedException + * @throws InterruptedException the thread is interrupted, either before or during the activity. */ public static Map getTableStoreFilePathMap(Map resultMap, final FileSystem fs, final Path hbaseRootDir, TableName tableName, final PathFilter sfFilter, @@ -1394,7 +1392,7 @@ public abstract class FSUtils extends CommonFSUtils { result += getReferenceFilePaths(fs, familyDir).size(); } } catch (IOException e) { - LOG.warn("Error Counting reference files.", e); + LOG.warn("Error counting reference files", e); } return result; } @@ -1537,13 +1535,11 @@ public abstract class FSUtils extends CommonFSUtils { try { status = fs.listStatus(dir); } catch (FileNotFoundException fnfe) { - // if directory doesn't exist, return null - if (LOG.isTraceEnabled()) { - LOG.trace(dir + " doesn't exist"); - } + LOG.trace("{} does not exist", dir); + return null; } - if (status == null || status.length < 1) { + if (ArrayUtils.getLength(status) == 0) { return null; } @@ -1575,7 +1571,7 @@ public abstract class FSUtils extends CommonFSUtils { if (file.getPermission().getUserAction().implies(action)) { return; } - } else if (contains(ugi.getGroupNames(), file.getGroup())) { + } else if (ArrayUtils.contains(ugi.getGroupNames(), file.getGroup())) { if (file.getPermission().getGroupAction().implies(action)) { return; } @@ -1586,15 +1582,6 @@ public abstract class FSUtils extends CommonFSUtils { + " path=" + file.getPath() + " user=" + ugi.getShortUserName()); } - private static boolean contains(String[] groups, String user) { - for (String group : groups) { - if (group.equals(user)) { - return true; - } - } - return false; - } - /** * This function is to scan the root path of the file system to get the * degree of locality for each region on each of the servers having at least @@ -1816,15 +1803,7 @@ public abstract class FSUtils extends CommonFSUtils { m.setAccessible(true); try { return (DFSHedgedReadMetrics)m.invoke(dfsclient); - } catch (IllegalAccessException e) { - LOG.warn("Failed invoking method " + name + " on dfsclient; no hedged read metrics: " + - e.getMessage()); - return null; - } catch (IllegalArgumentException e) { - LOG.warn("Failed invoking method " + name + " on dfsclient; no hedged read metrics: " + - e.getMessage()); - return null; - } catch (InvocationTargetException e) { + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { LOG.warn("Failed invoking method " + name + " on dfsclient; no hedged read metrics: " + e.getMessage()); return null; @@ -1842,7 +1821,7 @@ public abstract class FSUtils extends CommonFSUtils { future.get(); } } catch (ExecutionException | InterruptedException | IOException e) { - throw new IOException("copy snapshot reference files failed", e); + throw new IOException("Copy snapshot reference files failed", e); } finally { pool.shutdownNow(); } @@ -1856,7 +1835,7 @@ public abstract class FSUtils extends CommonFSUtils { FileStatus currentFileStatus = srcFS.getFileStatus(src); if (currentFileStatus.isDirectory()) { if (!dstFS.mkdirs(dst)) { - throw new IOException("create dir failed: " + dst); + throw new IOException("Create directory failed: " + dst); } FileStatus[] subPaths = srcFS.listStatus(src); for (FileStatus subPath : subPaths) {