From 69d3e332f1e0cf1ac581977483f2c865586f8d2d Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Sat, 3 Jun 2017 00:45:41 +0800 Subject: [PATCH] HBASE-18150: Do not call FSUtils.setVersion() and FSUtils.checkVersion() when using checkRootDir() to check hbase.wal.dir Signed-off-by: tedyu --- .../hadoop/hbase/master/MasterFileSystem.java | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java index 332a726b825..c1bd9307bcb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java @@ -469,16 +469,23 @@ public class MasterFileSystem { } else { fs.mkdirs(rd); } - // DFS leaves safe mode with 0 DNs when there are 0 blocks. - // We used to handle this by checking the current DN count and waiting until - // it is nonzero. With security, the check for datanode count doesn't work -- - // it is a privileged op. So instead we adopt the strategy of the jobtracker - // and simply retry file creation during bootstrap indefinitely. As soon as - // there is one datanode it will succeed. Permission problems should have - // already been caught by mkdirs above. - FSUtils.setVersion(fs, rd, c.getInt(HConstants.THREAD_WAKE_FREQUENCY, - 10 * 1000), c.getInt(HConstants.VERSION_FILE_WRITE_ATTEMPTS, - HConstants.DEFAULT_VERSION_FILE_WRITE_ATTEMPTS)); + + // HBASE-17437 updates createInitialFileSystemLayout() to re-use checkRootDir() + // to check hbase.wal.dir after checking hbase.rootdir. + // But FSUtils.setVersion() is supposed to be called only when checking hbase.rootdir, + // while it is supposed to be bypassed when checking hbase.wal.dir. + if (dirConfKey.equals(HConstants.HBASE_DIR)) { + // DFS leaves safe mode with 0 DNs when there are 0 blocks. + // We used to handle this by checking the current DN count and waiting until + // it is nonzero. With security, the check for datanode count doesn't work -- + // it is a privileged op. So instead we adopt the strategy of the jobtracker + // and simply retry file creation during bootstrap indefinitely. As soon as + // there is one datanode it will succeed. Permission problems should have + // already been caught by mkdirs above. + FSUtils.setVersion(fs, rd, + c.getInt(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000), + c.getInt(HConstants.VERSION_FILE_WRITE_ATTEMPTS, HConstants.DEFAULT_VERSION_FILE_WRITE_ATTEMPTS)); + } } else { if (!fs.isDirectory(rd)) { throw new IllegalArgumentException(rd.toString() + " is not a directory"); @@ -493,10 +500,16 @@ public class MasterFileSystem { + "and restarting the master"); fs.setPermission(rd, dirPerms); } - // as above - FSUtils.checkVersion(fs, rd, true, c.getInt(HConstants.THREAD_WAKE_FREQUENCY, - 10 * 1000), c.getInt(HConstants.VERSION_FILE_WRITE_ATTEMPTS, - HConstants.DEFAULT_VERSION_FILE_WRITE_ATTEMPTS)); + + // HBASE-17437 updates createInitialFileSystemLayout() to re-use checkRootDir() + // to check hbase.wal.dir after checking hbase.rootdir. + // But FSUtils.checkVersion() is supposed to be called only when checking hbase.rootdir, + // while it is supposed to be bypassed when checking hbase.wal.dir. + if (dirConfKey.equals(HConstants.HBASE_DIR)) { + FSUtils.checkVersion(fs, rd, true, + c.getInt(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000), + c.getInt(HConstants.VERSION_FILE_WRITE_ATTEMPTS, HConstants.DEFAULT_VERSION_FILE_WRITE_ATTEMPTS)); + } } } catch (DeserializationException de) { LOG.fatal("Please fix invalid configuration for " + dirConfKey, de);