Fix seeking to end of mmap segment

patch by benedict; reviewed by jake for CASSANDRA-10478


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

Branch: refs/heads/trunk
Commit: f87e34ed3c82a7b0b73178a6ce565a1227a7457b
Parents: 94b6471
Author: Benedict Elliott Smith <[email protected]>
Authored: Thu Oct 8 16:40:22 2015 +0100
Committer: Benedict Elliott Smith <[email protected]>
Committed: Sat Oct 10 09:20:16 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/io/util/MappedFileDataInput.java  |  8 +--
 .../io/util/MappedFileDataInputTest.java        | 67 ++++++++++++++++++++
 3 files changed, 69 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f87e34ed/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 7aa5eac..20529e8 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.11
+ * Fix mmap file segment seeking to EOF (CASSANDRA-10478)
  * Allow LOCAL_JMX to be easily overridden (CASSANDRA-10275)
  * Mark nodes as dead even if they've already left (CASSANDRA-10205)
  * Update internal python driver used by cqlsh (CASSANDRA-10161)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f87e34ed/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java 
b/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java
index f93ce72..d056240 100644
--- a/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java
+++ b/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java
@@ -51,18 +51,12 @@ public class MappedFileDataInput extends AbstractDataInput 
implements FileDataIn
     public void seek(long pos) throws IOException
     {
         long inSegmentPos = pos - segmentOffset;
-        if (!contains(pos))
+        if (inSegmentPos < 0 || inSegmentPos > buffer.capacity())
             throw new IOException(String.format("Seek position %d is not 
within mmap segment (seg offs: %d, length: %d)", pos, segmentOffset, 
buffer.capacity()));
 
         seekInternal((int) inSegmentPos);
     }
 
-    public boolean contains(long pos)
-    {
-        long inSegmentPos = pos - segmentOffset;
-        return inSegmentPos >= 0 && inSegmentPos < buffer.capacity();
-    }
-
     public long getFilePointer()
     {
         return segmentOffset + (long)position;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f87e34ed/test/unit/org/apache/cassandra/io/util/MappedFileDataInputTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/io/util/MappedFileDataInputTest.java 
b/test/unit/org/apache/cassandra/io/util/MappedFileDataInputTest.java
new file mode 100644
index 0000000..93b6923
--- /dev/null
+++ b/test/unit/org/apache/cassandra/io/util/MappedFileDataInputTest.java
@@ -0,0 +1,67 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.cassandra.io.util;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.MappedByteBuffer;
+
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+public class MappedFileDataInputTest
+{
+
+    @Test
+    public void testPositionAndSeek() throws IOException
+    {
+        MappedFileDataInput bbdi = new MappedFileDataInput((MappedByteBuffer) 
ByteBuffer.allocateDirect(100), "", 15, 1);
+        Assert.assertEquals(99, bbdi.bytesRemaining());
+//        Assert.assertEquals(16, bbdi.getPosition());
+        Assert.assertEquals(16, bbdi.getFilePointer());
+//        Assert.assertTrue(bbdi.markSupported());
+        FileMark mark = bbdi.mark();
+        bbdi.seek(115);
+        Assert.assertEquals(115, bbdi.getFilePointer());
+//        Assert.assertEquals(115, bbdi.getPosition());
+        Assert.assertEquals(99, bbdi.bytesPastMark(mark));
+        Assert.assertTrue(bbdi.isEOF());
+        bbdi.seek(15);
+        Assert.assertEquals(15, bbdi.getFilePointer());
+        Assert.assertEquals(15, bbdi.getPosition());
+        try
+        {
+            bbdi.seek(14);
+            Assert.assertTrue(false);
+        }
+        catch (IOException t)
+        {
+        }
+        try
+        {
+            bbdi.seek(116);
+            Assert.assertTrue(false);
+        }
+        catch (IOException t)
+        {
+        }
+    }
+
+}

Reply via email to