Index: src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java (revision 1134013) +++ src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java (working copy) @@ -152,7 +152,8 @@ * @throws IOException * @see https://issues.apache.org/jira/browse/HBASE-3020 */ - @Test public void testRecoveredEditsPathForMeta() throws IOException { + @Test + public void testRecoveredEditsPathForMeta() throws IOException { FileSystem fs = FileSystem.get(TEST_UTIL.getConfiguration()); byte [] encoded = HRegionInfo.FIRST_META_REGIONINFO.getEncodedNameAsBytes(); Path tdir = new Path(hbaseDir, Bytes.toString(HConstants.META_TABLE_NAME)); @@ -953,7 +954,35 @@ assertEquals(true, logsAreEqual(originalLog, splitLog)); } + + @Test + public void testSplitLogFileDeletedRegionDir() + throws IOException { + LOG.info("testSplitLogFileDeletedRegionDir"); + final String REGION = "region__1"; + regions.removeAll(regions); + regions.add(REGION); + + generateHLogs(1, 10, -1); + FileStatus logfile = fs.listStatus(hlogDir)[0]; + fs.initialize(fs.getUri(), conf); + + Path regiondir = new Path(tabledir, REGION); + LOG.info("Region directory is" + regiondir); + fs.delete(regiondir, true); + + HLogSplitter.splitLogFileToTemp(hbaseDir, "tmpdir", logfile, fs, + conf, reporter); + HLogSplitter.moveRecoveredEditsFromTemp("tmpdir", hbaseDir, oldLogDir, + logfile.getPath().toString(), conf); + + assertTrue(!fs.exists(regiondir)); + assertTrue(true); + } + + + @Test public void testSplitLogFileEmpty() throws IOException { LOG.info("testSplitLogFileEmpty"); @@ -1011,7 +1040,6 @@ assertEquals(1, fs.listStatus(corruptDir).length); } - private void flushToConsole(String s) { System.out.println(s); System.out.flush(); Index: src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java (revision 1134013) +++ src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java (working copy) @@ -355,7 +355,7 @@ } public boolean splitLogFileToTemp(FileStatus logfile, String tmpname, - CancelableProgressable reporter) throws IOException { + CancelableProgressable reporter) throws IOException { final Map logWriters = Collections. synchronizedMap(new TreeMap(Bytes.BYTES_COMPARATOR)); boolean isCorrupted = false; @@ -403,6 +403,11 @@ try { while ((entry = getNextLogLine(in,logPath, skipErrors)) != null) { byte[] region = entry.getKey().getEncodedRegionName(); + + /* Path regiondir = new Path(tabledir, region); + LOG.info("Printing the region directory"); + LOG.info("Region directory is " + regiondir); + */ Object o = logWriters.get(region); if (o == BAD_WRITER) { continue; @@ -411,7 +416,10 @@ if (wap == null) { wap = createWAP(region, entry, rootDir, tmpname, fs, conf); if (wap == null) { + // ignore edits from this region. It doesn't ezist anymore. + // It was probably already split. logWriters.put(region, BAD_WRITER); + continue; } else { logWriters.put(region, wap); } Index: src/main/java/org/apache/hadoop/hbase/regionserver/SplitLogWorker.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/SplitLogWorker.java (revision 1134013) +++ src/main/java/org/apache/hadoop/hbase/regionserver/SplitLogWorker.java (working copy) @@ -136,6 +136,7 @@ @Override public void run() { + try { LOG.info("SplitLogWorker " + this.serverName + " starting"); this.watcher.registerListener(this); int res; @@ -162,8 +163,13 @@ } taskLoop(); - - LOG.info("SplitLogWorker " + this.serverName + " exiting"); + } catch (Throwable t) { + // only a logical error can cause here. Printing it out + // to make debugging easier + LOG.error("unexpected error ", t); + } finally { + LOG.info("SplitLogWorker " + this.serverName + " exiting"); + } } /**