diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java index 9fa4e4c..a6606ae 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java @@ -304,6 +304,7 @@ calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); Date expireDate = calendar.getTime(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java index 5efb509..2441fb2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertEquals; +import java.io.IOException; import java.util.Random; import org.apache.hadoop.fs.FileStatus; @@ -46,6 +47,7 @@ private final static String family = "family"; private final static byte[] row1 = Bytes.toBytes("row1"); private final static byte[] row2 = Bytes.toBytes("row2"); + private final static byte[] row3 = Bytes.toBytes("row3"); private final static byte[] qf = Bytes.toBytes("qf"); private static BufferedMutator table; @@ -64,6 +66,7 @@ @Before public void setUp() throws Exception { TEST_UTIL.startMiniCluster(1); + init(); } @After @@ -87,6 +90,11 @@ admin.createTable(desc); table = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration()) .getBufferedMutator(tableName); + } + + private void truncateTable() throws IOException { + admin.disableTable(tableName); + admin.truncateTable(tableName, false); } private void modifyColumnExpiryDays(int expireDays) throws Exception { @@ -118,8 +126,7 @@ */ @Test public void testCleaner() throws Exception { - init(); - + truncateTable(); Path mobDirPath = MobUtils.getMobFamilyPath(TEST_UTIL.getConfiguration(), tableName, family); byte[] dummyData = makeDummyData(600); @@ -154,6 +161,41 @@ assertEquals("After cleanup without delay 2", secondFile, lastFile); } + @Test + public void testMobFileTTLClean() throws Exception { + truncateTable(); + Path mobDirPath = MobUtils.getMobFamilyPath(TEST_UTIL.getConfiguration(), tableName, family); + byte[] dummyData = makeDummyData(600); + long ts = System.currentTimeMillis() - 3 * secondsOfDay() * 1000; // 3 days before + putKVAndFlush(table, row1, dummyData, ts); + FileStatus[] files = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath); + //the first mob file + assertEquals("Before cleanup without delay 1", 1, files.length); + + ts = System.currentTimeMillis() - 2 * secondsOfDay() * 1000; // 2 day before + putKVAndFlush(table, row2, dummyData, ts); + files = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath); + //now there are 2 mob files + assertEquals("Before cleanup without delay 2", 2, files.length); + //the third mob file + ts = System.currentTimeMillis() - 1 * secondsOfDay() * 1000; // 1 day before + putKVAndFlush(table, row3, dummyData, ts); + files = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath); + assertEquals("Before cleanup without delay 3", 3, files.length); + + modifyColumnExpiryDays(2); // ttl = 2, make the first row expired + + //run the cleaner + String[] args = new String[2]; + args[0] = tableName.getNameAsString(); + args[1] = family; + ToolRunner.run(TEST_UTIL.getConfiguration(), new ExpiredMobFileCleaner(), args); + + files = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath); + //the first mob fie is removed + assertEquals("After cleanup without delay 1", 2, files.length); + } + private int secondsOfDay() { return 24 * 3600; }