Author: jbellis
Date: Mon Apr 25 17:29:08 2011
New Revision: 1096531

URL: http://svn.apache.org/viewvc?rev=1096531&view=rev
Log:
force GC to reclaim disk space on flush, if necessary
patch by jbellis; reviewed by slebresne for CASSANDRA-2404

Modified:
    cassandra/branches/cassandra-0.7/CHANGES.txt
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/BinaryMemtable.java
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/Memtable.java
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/StreamIn.java
    
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java

Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1096531&r1=1096530&r2=1096531&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Mon Apr 25 17:29:08 2011
@@ -1,3 +1,7 @@
+0.7.6
+ * force GC to reclaim disk space on flush, if necessary (CASSANDRA-2404)
+
+
 0.7.5
  * improvements/fixes to PIG driver (CASSANDRA-1618, CASSANDRA-2387,
    CASSANDRA-2465, CASSANDRA-2484)

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/BinaryMemtable.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/BinaryMemtable.java?rev=1096531&r1=1096530&r2=1096531&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/BinaryMemtable.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/BinaryMemtable.java
 Mon Apr 25 17:29:08 2011
@@ -125,7 +125,7 @@ public class BinaryMemtable implements I
     private SSTableReader writeSortedContents(List<DecoratedKey> sortedKeys) 
throws IOException
     {
         logger.info("Writing " + this);
-        SSTableWriter writer = cfs.createFlushWriter(sortedKeys.size());
+        SSTableWriter writer = cfs.createFlushWriter(sortedKeys.size(), 
DatabaseDescriptor.getBMTThreshold());
 
         for (DecoratedKey key : sortedKeys)
         {

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1096531&r1=1096530&r2=1096531&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
 Mon Apr 25 17:29:08 2011
@@ -657,22 +657,16 @@ public class ColumnFamilyStore implement
         return columnFamily;
     }
 
-    public String getFlushPath()
-    {
-        return getFlushPath(Descriptor.CURRENT_VERSION);
-    }
-
     /*
      * @return a temporary file name for an sstable.
      * When the sstable object is closed, it will be renamed to a non-temporary
      * format, so incomplete sstables can be recognized and removed on startup.
      */
-    public String getFlushPath(String version)
+    public String getFlushPath(long estimatedSize, String version)
     {
-        long guessedSize = 2L * memsize.value() * 1024*1024; // 2* adds room 
for keys, column indexes
-        String location = 
DatabaseDescriptor.getDataFileLocationForTable(table.name, guessedSize);
+        String location = table.getDataFileLocation(estimatedSize);
         if (location == null)
-            throw new RuntimeException("Insufficient disk space to flush");
+            throw new RuntimeException("Insufficient disk space to flush " + 
estimatedSize + " bytes");
         return getTempSSTablePath(location, version);
     }
 
@@ -2221,9 +2215,9 @@ public class ColumnFamilyStore implement
         }
     }
 
-    public SSTableWriter createFlushWriter(long estimatedRows) throws 
IOException
+    public SSTableWriter createFlushWriter(long estimatedRows, long 
estimatedSize) throws IOException
     {
-        return new SSTableWriter(getFlushPath(), estimatedRows, metadata, 
partitioner);
+        return new SSTableWriter(getFlushPath(estimatedSize, 
Descriptor.CURRENT_VERSION), estimatedRows, metadata, partitioner);
     }
 
     public SSTableWriter createCompactionWriter(long estimatedRows, String 
location) throws IOException

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/Memtable.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/Memtable.java?rev=1096531&r1=1096530&r2=1096531&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/Memtable.java 
(original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/Memtable.java 
Mon Apr 25 17:29:08 2011
@@ -29,7 +29,6 @@ import java.util.concurrent.ConcurrentNa
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
 import com.google.common.collect.Iterators;
@@ -93,7 +92,7 @@ public class Memtable implements Compara
     {
         return currentThroughput.get();
     }
-    
+
     public long getCurrentOperations()
     {
         return currentOperations.get();
@@ -156,7 +155,15 @@ public class Memtable implements Compara
     private SSTableReader writeSortedContents() throws IOException
     {
         logger.info("Writing " + this);
-        SSTableWriter writer = cfs.createFlushWriter(columnFamilies.size());
+
+        long keySize = 0;
+        for (DecoratedKey key : columnFamilies.keySet())
+            keySize += key.key.remaining();
+        long estimatedSize = (long) ((keySize // index entries
+                                      + keySize // keys in data file
+                                      + currentThroughput.get()) // data
+                                     * 1.2); // bloom filter and row index 
overhead
+        SSTableWriter writer = cfs.createFlushWriter(columnFamilies.size(), 
estimatedSize);
 
         for (Map.Entry<DecoratedKey, ColumnFamily> entry : 
columnFamilies.entrySet())
             writer.append(entry.getKey(), entry.getValue());

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/StreamIn.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/StreamIn.java?rev=1096531&r1=1096530&r2=1096531&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/StreamIn.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/StreamIn.java
 Mon Apr 25 17:29:08 2011
@@ -69,7 +69,7 @@ public class StreamIn
         // new local sstable
         Table table = Table.open(remotedesc.ksname);
         ColumnFamilyStore cfStore = 
table.getColumnFamilyStore(remotedesc.cfname);
-        Descriptor localdesc = 
Descriptor.fromFilename(cfStore.getFlushPath(remote.desc.version));
+        Descriptor localdesc = 
Descriptor.fromFilename(cfStore.getFlushPath(remote.size, remote.desc.version));
 
         return new PendingFile(localdesc, remote);
      }

Modified: 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java?rev=1096531&r1=1096530&r2=1096531&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java
 Mon Apr 25 17:29:08 2011
@@ -300,7 +300,6 @@ public class DefsTest extends CleanupHel
         ColumnFamilyStore store = 
Table.open(cfm.tableName).getColumnFamilyStore(cfm.cfName);
         assert store != null;
         store.forceBlockingFlush();
-        store.getFlushPath();
         assert DefsTable.getFiles(cfm.tableName, cfm.cfName).size() > 0;
         
         new DropColumnFamily(ks.name, cfm.cfName).apply();


Reply via email to