Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 572ef50dd -> 521b36311
  refs/heads/trunk 7aefd914c -> abd528a0f


Use correct bounds for page cache eviction of compressed files

patch by benedict; reviewed by marcus for CASSANDRA-8746


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/521b3631
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/521b3631
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/521b3631

Branch: refs/heads/cassandra-2.1
Commit: 521b36311ad23f3defd6abf36becda61388add9c
Parents: 572ef50
Author: Benedict Elliott Smith <[email protected]>
Authored: Wed Mar 18 11:08:08 2015 +0000
Committer: Benedict Elliott Smith <[email protected]>
Committed: Wed Mar 18 11:08:08 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/io/sstable/SSTableReader.java     | 40 +++-----------------
 .../io/util/CompressedPoolingSegmentedFile.java |  7 ++++
 .../io/util/CompressedSegmentedFile.java        |  7 ++++
 .../apache/cassandra/io/util/SegmentedFile.java |  6 +++
 5 files changed, 27 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/521b3631/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 36bdb39..3f96330 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.4
+ * Use correct bounds for page cache eviction of compressed files 
(CASSANDRA-8746)
  * SSTableScanner enforces its bounds (CASSANDRA-8946)
  * Cleanup cell equality (CASSANDRA-8947)
  * Introduce intra-cluster message coalescing (CASSANDRA-8692)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/521b3631/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java 
b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
index 41e4adb..f42bfc7 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
@@ -896,8 +896,8 @@ public class SSTableReader extends SSTable implements 
SelfRefCounted<SSTableRead
                 {
                     public void run()
                     {
-                        CLibrary.trySkipCache(dfile.path, 0, dataStart);
-                        CLibrary.trySkipCache(ifile.path, 0, indexStart);
+                        dfile.dropPageCache(dataStart);
+                        ifile.dropPageCache(indexStart);
                         if (runOnClose != null)
                             runOnClose.run();
                     }
@@ -920,8 +920,8 @@ public class SSTableReader extends SSTable implements 
SelfRefCounted<SSTableRead
             {
                 public void run()
                 {
-                    CLibrary.trySkipCache(dfile.path, 0, 0);
-                    CLibrary.trySkipCache(ifile.path, 0, 0);
+                    dfile.dropPageCache(0);
+                    ifile.dropPageCache(0);
                     runOnClose.run();
                 }
             };
@@ -2181,8 +2181,8 @@ public class SSTableReader extends SSTable implements 
SelfRefCounted<SSTableRead
             if (isCompacted.get())
                 SystemKeyspace.clearSSTableReadMeter(desc.ksname, desc.cfname, 
desc.generation);
             // don't ideally want to dropPageCache for the file until all 
instances have been released
-            dropPageCache(desc.filenameFor(Component.DATA));
-            dropPageCache(desc.filenameFor(Component.PRIMARY_INDEX));
+            CLibrary.trySkipCache(desc.filenameFor(Component.DATA), 0, 0);
+            CLibrary.trySkipCache(desc.filenameFor(Component.PRIMARY_INDEX), 
0, 0);
         }
 
         public String name()
@@ -2204,32 +2204,4 @@ public class SSTableReader extends SSTable implements 
SelfRefCounted<SSTableRead
             return refc;
         }
     }
-
-    private static void dropPageCache(String filePath)
-    {
-        RandomAccessFile file = null;
-
-        try
-        {
-            file = new RandomAccessFile(filePath, "r");
-
-            int fd = CLibrary.getfd(file.getFD());
-
-            if (fd > 0)
-            {
-                if (logger.isDebugEnabled())
-                    logger.debug(String.format("Dropping page cache of file 
%s.", filePath));
-
-                CLibrary.trySkipCache(fd, 0, 0);
-            }
-        }
-        catch (IOException e)
-        {
-            // we don't care if cache cleanup fails
-        }
-        finally
-        {
-            FileUtils.closeQuietly(file);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/521b3631/src/java/org/apache/cassandra/io/util/CompressedPoolingSegmentedFile.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/io/util/CompressedPoolingSegmentedFile.java 
b/src/java/org/apache/cassandra/io/util/CompressedPoolingSegmentedFile.java
index 40a54dc..3b71ddd 100644
--- a/src/java/org/apache/cassandra/io/util/CompressedPoolingSegmentedFile.java
+++ b/src/java/org/apache/cassandra/io/util/CompressedPoolingSegmentedFile.java
@@ -73,6 +73,13 @@ public class CompressedPoolingSegmentedFile extends 
PoolingSegmentedFile impleme
         }
     }
 
+    public void dropPageCache(long before)
+    {
+        if (before >= metadata.dataLength)
+            super.dropPageCache(0);
+        super.dropPageCache(metadata.chunkFor(before).offset);
+    }
+
     public RandomAccessReader createReader()
     {
         return CompressedRandomAccessReader.open(path, metadata, null);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/521b3631/src/java/org/apache/cassandra/io/util/CompressedSegmentedFile.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/CompressedSegmentedFile.java 
b/src/java/org/apache/cassandra/io/util/CompressedSegmentedFile.java
index 9721bc3..830fc4b 100644
--- a/src/java/org/apache/cassandra/io/util/CompressedSegmentedFile.java
+++ b/src/java/org/apache/cassandra/io/util/CompressedSegmentedFile.java
@@ -88,6 +88,13 @@ public class CompressedSegmentedFile extends SegmentedFile 
implements ICompresse
         }
     }
 
+    public void dropPageCache(long before)
+    {
+        if (before >= metadata.dataLength)
+            super.dropPageCache(0);
+        super.dropPageCache(metadata.chunkFor(before).offset);
+    }
+
     public RandomAccessReader createReader()
     {
         return CompressedRandomAccessReader.open(path, metadata);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/521b3631/src/java/org/apache/cassandra/io/util/SegmentedFile.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/SegmentedFile.java 
b/src/java/org/apache/cassandra/io/util/SegmentedFile.java
index 146494d..c65ecbf 100644
--- a/src/java/org/apache/cassandra/io/util/SegmentedFile.java
+++ b/src/java/org/apache/cassandra/io/util/SegmentedFile.java
@@ -31,6 +31,7 @@ import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.compress.CompressedSequentialWriter;
+import org.apache.cassandra.utils.CLibrary;
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.concurrent.RefCounted;
 import org.apache.cassandra.utils.concurrent.SharedCloseableImpl;
@@ -111,6 +112,11 @@ public abstract class SegmentedFile extends 
SharedCloseableImpl
         return reader;
     }
 
+    public void dropPageCache(long before)
+    {
+        CLibrary.trySkipCache(path, 0, before);
+    }
+
     /**
      * @return A SegmentedFile.Builder.
      */

Reply via email to