diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionWALRoller.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionWALRoller.java index ef3dd121133..bba6611c68d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionWALRoller.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionWALRoller.java @@ -29,7 +29,6 @@ import org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL; import org.apache.hadoop.hbase.regionserver.wal.WALUtil; import org.apache.hadoop.hbase.wal.AbstractFSWALProvider; import org.apache.hadoop.hbase.wal.AbstractWALRoller; -import org.apache.hadoop.hbase.wal.WAL; import org.apache.hadoop.hbase.wal.WALFactory; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; @@ -68,8 +67,11 @@ public final class MasterRegionWALRoller extends AbstractWALRoller { } @Override - protected void afterRoll(WAL wal) { + protected void afterWALArchive(Path oldPath, Path newPath) { // move the archived WAL files to the global archive path + // here we do not use the newPath directly, so that even if we fail to move some of the + // newPaths, we are still safe because every time we will get all the files under the archive + // directory. try { MasterRegionUtils.moveFilesUnderDir(fs, walArchiveDir, globalWALArchiveDir, archivedWALSuffix); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/AbstractWALRoller.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/AbstractWALRoller.java index 9263c0f9d68..3f20dfdd6ea 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/AbstractWALRoller.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/AbstractWALRoller.java @@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.Abortable; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL; @@ -85,6 +86,11 @@ public abstract class AbstractWALRoller extends Thread AbstractWALRoller.this.notifyAll(); } } + + @Override + public void postLogArchive(Path oldPath, Path newPath) throws IOException { + afterWALArchive(oldPath, newPath); + } }); } } @@ -184,7 +190,6 @@ public abstract class AbstractWALRoller extends Thread scheduleFlush(Bytes.toString(r.getKey()), r.getValue()); } } - afterRoll(wal); } } catch (FailedLogCloseException | ConnectException e) { abort("Failed log close in log roller", e); @@ -200,10 +205,7 @@ public abstract class AbstractWALRoller extends Thread LOG.info("LogRoller exiting."); } - /** - * Called after we finish rolling the give {@code wal}. - */ - protected void afterRoll(WAL wal) { + protected void afterWALArchive(Path oldPath, Path newPath) { } /** diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java index fb1d0ac90f6..d21bf2a287e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java @@ -86,8 +86,12 @@ public class TestMasterRegionWALCleaner extends MasterRegionTestBase { region.requestRollAll(); region.waitUntilWalRollFinished(); // should have one - - Thread.sleep(9000); + FileStatus[] files = fs.listStatus(globalWALArchiveDir); + assertEquals(1, files.length); Thread.sleep(9000); + Thread.sleep(2000); + // should still be there + assertTrue(fs.exists(files[0].getPath())); + Thread.sleep(6000); // should have been cleaned assertEquals(0, fs.listStatus(globalWALArchiveDir).length); }