You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2015/03/18 12:09:07 UTC

[2/4] cassandra git commit: Use correct bounds for page cache eviction of compressed files

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/trunk
Commit: 521b36311ad23f3defd6abf36becda61388add9c
Parents: 572ef50
Author: Benedict Elliott Smith <be...@apache.org>
Authored: Wed Mar 18 11:08:08 2015 +0000
Committer: Benedict Elliott Smith <be...@apache.org>
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.
      */