Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1342153) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -597,11 +597,9 @@ } this.assignmentManager.startTimeOutMonitor(); - Set onlineServers = new HashSet(serverManager - .getOnlineServers().keySet()); // TODO: Should do this in background rather than block master startup status.setStatus("Splitting logs after master startup"); - splitLogAfterStartup(this.fileSystemManager, onlineServers); + Set onlineServers = splitLogAfterStartup(this.fileSystemManager); // Make sure root and meta assigned before proceeding. if (!assignRootAndMeta(status)) return; @@ -660,11 +658,10 @@ /** * Override to change master's splitLogAfterStartup. Used testing * @param mfs - * @param onlineServers + * @return onlineServers Set of online servers (considered in splitting) */ - protected void splitLogAfterStartup(final MasterFileSystem mfs, - Set onlineServers) { - mfs.splitLogAfterStartup(onlineServers); + protected Set splitLogAfterStartup(final MasterFileSystem mfs) { + return mfs.splitLogAfterStartup(); } /** Index: src/test/java/org/apache/hadoop/hbase/regionserver/TestRSKilledWhenMasterInitializing.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/regionserver/TestRSKilledWhenMasterInitializing.java (revision 1342153) +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestRSKilledWhenMasterInitializing.java (working copy) @@ -98,9 +98,8 @@ } @Override - protected void splitLogAfterStartup(MasterFileSystem mfs, - Set onlineServers) { - super.splitLogAfterStartup(mfs, onlineServers); + protected Set splitLogAfterStartup(MasterFileSystem mfs) { + Set onlineServers = super.splitLogAfterStartup(mfs); logSplit = true; // If "TestingMaster.sleep" is set, sleep after log split. if (getConfiguration().getBoolean("TestingMaster.sleep", false)) { @@ -108,6 +107,7 @@ "TestingMaster.sleep.duration", 0); Threads.sleep(duration); } + return onlineServers; } Index: src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java (revision 1342153) +++ src/main/java/org/apache/hadoop/hbase/master/MasterFileSystem.java (working copy) @@ -21,9 +21,9 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.UUID; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -187,22 +187,29 @@ /** * Inspect the log directory to recover any log file without * an active region server. - * @param onlineServers Set of online servers keyed by - * {@link ServerName} + * @return onlineServers Set of online servers (considered in splitting) */ - void splitLogAfterStartup(final Set onlineServers) { + Set splitLogAfterStartup() { boolean retrySplitting = !conf.getBoolean("hbase.hlog.split.skip.errors", HLog.SPLIT_SKIP_ERRORS_DEFAULT); Path logsDirPath = new Path(this.rootdir, HConstants.HREGION_LOGDIR_NAME); + Set onlineServers = new HashSet(services + .getServerManager().getOnlineServersList()); do { List serverNames = new ArrayList(); try { - if (!this.fs.exists(logsDirPath)) return; + if (!this.fs.exists(logsDirPath)) { + return onlineServers; + } FileStatus[] logFolders = FSUtils.listStatus(this.fs, logsDirPath, null); + // Get the online servers again to prevent splitting delayed check in + // regionserver's log + onlineServers = new HashSet(services.getServerManager() + .getOnlineServersList()); if (logFolders == null || logFolders.length == 0) { LOG.debug("No log files to split, proceeding..."); - return; + return onlineServers; } for (FileStatus status : logFolders) { String sn = status.getPath().getName(); @@ -241,6 +248,7 @@ } } } while (retrySplitting); + return onlineServers; } public void splitLog(final ServerName serverName) throws IOException { Index: src/main/java/org/apache/hadoop/hbase/master/ServerManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/ServerManager.java (revision 1342153) +++ src/main/java/org/apache/hadoop/hbase/master/ServerManager.java (working copy) @@ -200,7 +200,10 @@ existingServer + " looks stale, new server:" + serverName); expireServer(existingServer); } - throw new PleaseHoldException(message); + if (services.isServerShutdownHandlerEnabled()) { + // master has completed the initialization + throw new PleaseHoldException(message); + } } }