From 843e14155b046d8b64dccb2e2e37a8dd2906d5d9 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Thu, 21 Apr 2016 19:58:13 +0200 Subject: [PATCH] Add support for ReadableByteChannel views to AdversarialPagedFile --- .../PagedReadableByteChannel.java | 4 ++-- .../impl/muninn/MuninnPagedFile.java | 1 + .../pagecache/AdversarialPagedFile.java | 9 +++++---- .../org/neo4j/io/pagecache/PageCacheTest.java | 20 +++++++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) rename community/io/src/main/java/org/neo4j/io/pagecache/impl/{muninn => }/PagedReadableByteChannel.java (95%) diff --git a/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/PagedReadableByteChannel.java b/community/io/src/main/java/org/neo4j/io/pagecache/impl/PagedReadableByteChannel.java similarity index 95% rename from community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/PagedReadableByteChannel.java rename to community/io/src/main/java/org/neo4j/io/pagecache/impl/PagedReadableByteChannel.java index 32065fd541a0a..cae30b4c4fc7c 100644 --- a/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/PagedReadableByteChannel.java +++ b/community/io/src/main/java/org/neo4j/io/pagecache/impl/PagedReadableByteChannel.java @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.neo4j.io.pagecache.impl.muninn; +package org.neo4j.io.pagecache.impl; import java.io.IOException; import java.nio.ByteBuffer; @@ -27,7 +27,7 @@ import org.neo4j.io.pagecache.PageCursor; import org.neo4j.io.pagecache.PagedFile; -final class PagedReadableByteChannel implements ReadableByteChannel +public final class PagedReadableByteChannel implements ReadableByteChannel { private final PageCursor cursor; private boolean open = true; diff --git a/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java b/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java index 62d0c727c9a90..1b1d7b28c7bee 100644 --- a/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java +++ b/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java @@ -30,6 +30,7 @@ import org.neo4j.io.pagecache.PageSwapper; import org.neo4j.io.pagecache.PageSwapperFactory; import org.neo4j.io.pagecache.PagedFile; +import org.neo4j.io.pagecache.impl.PagedReadableByteChannel; import org.neo4j.io.pagecache.tracing.FlushEvent; import org.neo4j.io.pagecache.tracing.FlushEventOpportunity; import org.neo4j.io.pagecache.tracing.MajorFlushEvent; diff --git a/community/io/src/test/java/org/neo4j/adversaries/pagecache/AdversarialPagedFile.java b/community/io/src/test/java/org/neo4j/adversaries/pagecache/AdversarialPagedFile.java index 3d3fe75bbe891..26c4f2836e5bf 100644 --- a/community/io/src/test/java/org/neo4j/adversaries/pagecache/AdversarialPagedFile.java +++ b/community/io/src/test/java/org/neo4j/adversaries/pagecache/AdversarialPagedFile.java @@ -28,6 +28,7 @@ import org.neo4j.io.pagecache.IOLimiter; import org.neo4j.io.pagecache.PageCursor; import org.neo4j.io.pagecache.PagedFile; +import org.neo4j.io.pagecache.impl.PagedReadableByteChannel; /** * A {@linkplain PagedFile paged file} that wraps another paged file and an {@linkplain Adversary adversary} to provide @@ -37,12 +38,12 @@ * or {@link IOException} like {@link FileNotFoundException}. */ @SuppressWarnings( "unchecked" ) -class AdversarialPagedFile implements PagedFile +public class AdversarialPagedFile implements PagedFile { private final PagedFile delegate; private final Adversary adversary; - AdversarialPagedFile( PagedFile delegate, Adversary adversary ) + public AdversarialPagedFile( PagedFile delegate, Adversary adversary ) { this.delegate = Objects.requireNonNull( delegate ); this.adversary = Objects.requireNonNull( adversary ); @@ -95,8 +96,8 @@ public void close() throws IOException } @Override - public ReadableByteChannel openReadableByteChannel() + public ReadableByteChannel openReadableByteChannel() throws IOException { - throw new UnsupportedOperationException( "Not implemented for AdversarialPagedFile" ); + return new PagedReadableByteChannel( this ); } } diff --git a/community/io/src/test/java/org/neo4j/io/pagecache/PageCacheTest.java b/community/io/src/test/java/org/neo4j/io/pagecache/PageCacheTest.java index df5764c4fe35f..680355ea8809d 100644 --- a/community/io/src/test/java/org/neo4j/io/pagecache/PageCacheTest.java +++ b/community/io/src/test/java/org/neo4j/io/pagecache/PageCacheTest.java @@ -48,6 +48,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import org.neo4j.adversaries.RandomAdversary; +import org.neo4j.adversaries.pagecache.AdversarialPagedFile; import org.neo4j.concurrent.BinaryLatch; import org.neo4j.function.ThrowingConsumer; import org.neo4j.graphdb.mockfs.DelegatingFileSystemAbstraction; @@ -4029,6 +4031,24 @@ public void readableByteChannelMustReadAllBytesInFile() throws Exception } } + @RepeatRule.Repeat( times = 20 ) + @Test + public void readableByteChannelMustReadAllBytesInFileConsistently() throws Exception + { + File file = file( "a" ); + generateFileWithRecords( file, recordCount, recordSize ); + getPageCache( fs, maxPages, pageCachePageSize, PageCacheTracer.NULL ); + try ( PagedFile pf = pageCache.map( file, filePageSize ) ) + { + RandomAdversary adversary = new RandomAdversary( 0.9, 0, 0 ); + AdversarialPagedFile apf = new AdversarialPagedFile( pf, adversary ); + try ( ReadableByteChannel channel = apf.openReadableByteChannel() ) + { + verifyRecordsInFile( channel, recordCount ); + } + } + } + @Test( expected = ClosedChannelException.class ) public void readingFromClosedReadableByteChannelMustThrow() throws Exception {