Fix seeking to end of mmap segment

patch by benedict; reviewed by jake for CASSANDRA-10478
This commit is contained in:
Benedict Elliott Smith 2015-10-08 16:40:22 +01:00
parent 94b6471b93
commit f87e34ed3c
3 changed files with 69 additions and 7 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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)
{
}
}
}