Repository: cassandra Updated Branches: refs/heads/cassandra-2.1 94b6471b9 -> f87e34ed3 refs/heads/cassandra-2.2 3573faf49 -> 352928467 refs/heads/cassandra-3.0 6584331c8 -> fc92c9621 refs/heads/trunk e8d8941cc -> 739de136d
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/cassandra-2.1 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) + { + } + } + +}
