You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2014/01/17 21:49:58 UTC

svn commit: r1559248 - in /hbase/branches/0.98/hbase-server/src: main/java/org/apache/hadoop/hbase/regionserver/compactions/ test/java/org/apache/hadoop/hbase/regionserver/

Author: tedyu
Date: Fri Jan 17 20:49:57 2014
New Revision: 1559248

URL: http://svn.apache.org/r1559248
Log:
HBASE-10371 Compaction creates empty hfile, then selects this file for compaction and creates empty hfile and over again


Modified:
    hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java
    hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java
    hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.java

Modified: hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java?rev=1559248&r1=1559247&r2=1559248&view=diff
==============================================================================
--- hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java (original)
+++ hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java Fri Jan 17 20:49:57 2014
@@ -156,7 +156,11 @@ public class RatioBasedCompactionPolicy 
         expiredStoreFiles.add(storeFile);
       }
     }
-
+    if (expiredStoreFiles != null && expiredStoreFiles.size() == 1
+        && expiredStoreFiles.get(0).getReader().getEntries() == 0) {
+      // If just one empty store file, do not select for compaction.
+      return null;
+    }
     return expiredStoreFiles;
   }
 

Modified: hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java?rev=1559248&r1=1559247&r2=1559248&view=diff
==============================================================================
--- hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java (original)
+++ hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java Fri Jan 17 20:49:57 2014
@@ -36,6 +36,8 @@ public class MockStoreFile extends Store
   long sequenceid;
   private Map<byte[], byte[]> metadata = new TreeMap<byte[], byte[]>(Bytes.BYTES_COMPARATOR);
   byte[] splitPoint = null;
+  TimeRangeTracker timeRangeTracker;
+  long entryCount;
 
   MockStoreFile(HBaseTestingUtility testUtil, Path testPath,
       long length, long ageInDisk, boolean isRef, long sequenceid) throws IOException {
@@ -85,14 +87,34 @@ public class MockStoreFile extends Store
     this.metadata.put(key, value);
   }
 
+  void setTimeRangeTracker(TimeRangeTracker timeRangeTracker) {
+    this.timeRangeTracker = timeRangeTracker;
+  }
+
+  void setEntries(long entryCount) {
+    this.entryCount = entryCount;
+  }
+
   @Override
   public StoreFile.Reader getReader() {
     final long len = this.length;
+    final TimeRangeTracker timeRange = this.timeRangeTracker;
+    final long entries = this.entryCount;
     return new StoreFile.Reader() {
       @Override
       public long length() {
         return len;
       }
+
+      @Override
+      public long getMaxTimestamp() {
+        return timeRange == null ? Long.MAX_VALUE : timeRange.maximumTimestamp;
+      }
+
+      @Override
+      public long getEntries() {
+        return entries;
+      }
     };
   }
 }

Modified: hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.java?rev=1559248&r1=1559247&r2=1559248&view=diff
==============================================================================
--- hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.java (original)
+++ hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.java Fri Jan 17 20:49:57 2014
@@ -36,8 +36,6 @@ import org.apache.hadoop.hbase.HRegionIn
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.SmallTests;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.io.hfile.CacheConfig;
-import org.apache.hadoop.hbase.io.hfile.NoOpDataBlockEncoder;
 import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;
 import org.apache.hadoop.hbase.regionserver.compactions.RatioBasedCompactionPolicy;
 import org.apache.hadoop.hbase.regionserver.wal.HLog;
@@ -304,4 +302,29 @@ public class TestDefaultCompactSelection
     // Prefer later compaction if the benefit is significant.
     compactEquals(sfCreate(99,99,99,99, 27,27,27,20,20,20), 20, 20, 20);
   }
+
+  public void testCompactionEmptyHFile() throws IOException {
+    // Set TTL
+    ScanInfo oldScanInfo = store.getScanInfo();
+    ScanInfo newScanInfo = new ScanInfo(oldScanInfo.getFamily(),
+        oldScanInfo.getMinVersions(), oldScanInfo.getMaxVersions(), 600,
+        oldScanInfo.getKeepDeletedCells(), oldScanInfo.getTimeToPurgeDeletes(),
+        oldScanInfo.getComparator());
+    store.setScanInfo(newScanInfo);
+    // Do not compact empty store file
+    List<StoreFile> candidates = sfCreate(0);
+    for (StoreFile file : candidates) {
+      if (file instanceof MockStoreFile) {
+        MockStoreFile mockFile = (MockStoreFile) file;
+        mockFile.setTimeRangeTracker(new TimeRangeTracker(-1, -1));
+        mockFile.setEntries(0);
+      }
+    }
+    // Test Default compactions
+    CompactionRequest result = ((RatioBasedCompactionPolicy) store.storeEngine
+        .getCompactionPolicy()).selectCompaction(candidates,
+        new ArrayList<StoreFile>(), false, false, false);
+    assertTrue(result.getFiles().size() == 0);
+    store.setScanInfo(oldScanInfo);
+  }
 }