Index: lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java =================================================================== --- lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java (revision 1304862) +++ lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java (working copy) @@ -34,6 +34,8 @@ * but can be changed with {@link #setLockFactory}. */ public class RAMDirectory extends Directory { + static final int DEFAULT_BUFFER_SIZE = 8192; + protected final Map fileMap = new ConcurrentHashMap(); protected final AtomicLong sizeInBytes = new AtomicLong(); @@ -79,6 +81,10 @@ dir.close(); } } + + public final int getBufferSize() { + return DEFAULT_BUFFER_SIZE; + } @Override public final String[] listAll() { @@ -128,7 +134,6 @@ ensureOpen(); RAMFile file = fileMap.remove(name); if (file != null) { - file.directory = null; sizeInBytes.addAndGet(-file.sizeInBytes); } else { throw new FileNotFoundException(name); @@ -143,7 +148,6 @@ RAMFile existing = fileMap.remove(name); if (existing != null) { sizeInBytes.addAndGet(-existing.sizeInBytes); - existing.directory = null; } fileMap.put(name, file); return new RAMOutputStream(file); @@ -155,7 +159,7 @@ * {@link RAMFile#newBuffer(int)}. */ protected RAMFile newRAMFile() { - return new RAMFile(this); + return new RAMFile(this, DEFAULT_BUFFER_SIZE); } @Override Index: lucene/core/src/java/org/apache/lucene/store/RAMFile.java =================================================================== --- lucene/core/src/java/org/apache/lucene/store/RAMFile.java (revision 1304862) +++ lucene/core/src/java/org/apache/lucene/store/RAMFile.java (working copy) @@ -22,15 +22,19 @@ /** @lucene.internal */ public class RAMFile { protected ArrayList buffers = new ArrayList(); + protected final int bufferSize; long length; - RAMDirectory directory; + final RAMDirectory directory; protected long sizeInBytes; // File used as buffer, in no RAMDirectory - public RAMFile() {} + public RAMFile() { + this(null, RAMDirectory.DEFAULT_BUFFER_SIZE); + } - RAMFile(RAMDirectory directory) { + RAMFile(RAMDirectory directory, int bufferSize) { this.directory = directory; + this.bufferSize = bufferSize; } // For non-stream access from thread that might be concurrent with writing Index: lucene/core/src/java/org/apache/lucene/store/RAMInputStream.java =================================================================== --- lucene/core/src/java/org/apache/lucene/store/RAMInputStream.java (revision 1304862) +++ lucene/core/src/java/org/apache/lucene/store/RAMInputStream.java (working copy) @@ -24,11 +24,10 @@ * * @lucene.internal */ public class RAMInputStream extends IndexInput implements Cloneable { - static final int BUFFER_SIZE = RAMOutputStream.BUFFER_SIZE; + private final RAMFile file; + private final int bufferSize; + private final long length; - private RAMFile file; - private long length; - private byte[] currentBuffer; private int currentBufferIndex; @@ -40,7 +39,8 @@ super("RAMInputStream(name=" + name + ")"); file = f; length = file.length; - if (length/BUFFER_SIZE >= Integer.MAX_VALUE) { + bufferSize = file.bufferSize; + if (length/bufferSize >= Integer.MAX_VALUE) { throw new IOException("RAMInputStream too large length=" + length + ": " + name); } @@ -50,6 +50,10 @@ currentBuffer = null; } + public final int getBufferSize() { + return bufferSize; + } + @Override public void close() { // nothing to do here @@ -87,7 +91,7 @@ } private final void switchCurrentBuffer(boolean enforceEOF) throws IOException { - bufferStart = (long) BUFFER_SIZE * (long) currentBufferIndex; + bufferStart = (long) bufferSize * (long) currentBufferIndex; if (currentBufferIndex >= file.numBuffers()) { // end of file reached, no more buffers left if (enforceEOF) { @@ -95,13 +99,13 @@ } else { // Force EOF if a read takes place at this position currentBufferIndex--; - bufferPosition = BUFFER_SIZE; + bufferPosition = bufferSize; } } else { currentBuffer = file.getBuffer(currentBufferIndex); bufferPosition = 0; long buflen = length - bufferStart; - bufferLength = buflen > BUFFER_SIZE ? BUFFER_SIZE : (int) buflen; + bufferLength = buflen > bufferSize ? bufferSize : (int) buflen; } } @@ -133,10 +137,10 @@ @Override public void seek(long pos) throws IOException { - if (currentBuffer==null || pos < bufferStart || pos >= bufferStart + BUFFER_SIZE) { - currentBufferIndex = (int) (pos / BUFFER_SIZE); + if (currentBuffer==null || pos < bufferStart || pos >= bufferStart + bufferSize) { + currentBufferIndex = (int) (pos / bufferSize); switchCurrentBuffer(false); } - bufferPosition = (int) (pos % BUFFER_SIZE); + bufferPosition = (int) (pos % bufferSize); } } Index: lucene/core/src/java/org/apache/lucene/store/RAMOutputStream.java =================================================================== --- lucene/core/src/java/org/apache/lucene/store/RAMOutputStream.java (revision 1304862) +++ lucene/core/src/java/org/apache/lucene/store/RAMOutputStream.java (working copy) @@ -25,10 +25,9 @@ * @lucene.internal */ public class RAMOutputStream extends IndexOutput { - static final int BUFFER_SIZE = 1024; + private final RAMFile file; + private final int bufferSize; - private RAMFile file; - private byte[] currentBuffer; private int currentBufferIndex; @@ -43,6 +42,7 @@ public RAMOutputStream(RAMFile f) { file = f; + bufferSize = file.bufferSize; // make sure that we switch to the // first needed buffer lazily @@ -50,6 +50,10 @@ currentBuffer = null; } + public final int getBufferSize() { + return bufferSize; + } + /** Copy the current contents of this buffer to the named output. */ public void writeTo(IndexOutput out) throws IOException { flush(); @@ -57,7 +61,7 @@ long pos = 0; int buffer = 0; while (pos < end) { - int length = BUFFER_SIZE; + int length = bufferSize; long nextPos = pos + length; if (nextPos > end) { // at the last buffer length = (int)(end - pos); @@ -76,7 +80,7 @@ int buffer = 0; int bytesUpto = offset; while (pos < end) { - int length = BUFFER_SIZE; + int length = bufferSize; long nextPos = pos + length; if (nextPos > end) { // at the last buffer length = (int)(end - pos); @@ -108,11 +112,11 @@ // and flush() has not been called yet setFileLength(); if (pos < bufferStart || pos >= bufferStart + bufferLength) { - currentBufferIndex = (int) (pos / BUFFER_SIZE); + currentBufferIndex = (int) (pos / bufferSize); switchCurrentBuffer(); } - bufferPosition = (int) (pos % BUFFER_SIZE); + bufferPosition = (int) (pos % bufferSize); } @Override @@ -149,12 +153,12 @@ private final void switchCurrentBuffer() throws IOException { if (currentBufferIndex == file.numBuffers()) { - currentBuffer = file.addBuffer(BUFFER_SIZE); + currentBuffer = file.addBuffer(bufferSize); } else { currentBuffer = file.getBuffer(currentBufferIndex); } bufferPosition = 0; - bufferStart = (long) BUFFER_SIZE * (long) currentBufferIndex; + bufferStart = (long) bufferSize * (long) currentBufferIndex; bufferLength = currentBuffer.length; } @@ -177,7 +181,7 @@ /** Returns byte usage of all buffers. */ public long sizeInBytes() { - return file.numBuffers() * BUFFER_SIZE; + return file.numBuffers() * bufferSize; } @Override Index: lucene/core/src/test/org/apache/lucene/store/TestHugeRamFile.java =================================================================== --- lucene/core/src/test/org/apache/lucene/store/TestHugeRamFile.java (revision 1304862) +++ lucene/core/src/test/org/apache/lucene/store/TestHugeRamFile.java (working copy) @@ -55,8 +55,8 @@ DenseRAMFile f = new DenseRAMFile(); // output part RAMOutputStream out = new RAMOutputStream(f); - byte b1[] = new byte[RAMOutputStream.BUFFER_SIZE]; - byte b2[] = new byte[RAMOutputStream.BUFFER_SIZE / 3]; + byte b1[] = new byte[out.getBufferSize()]; + byte b2[] = new byte[out.getBufferSize() / 3]; for (int i = 0; i < b1.length; i++) { b1[i] = (byte) (i & 0x0007F); } Index: lucene/core/src/test/org/apache/lucene/store/TestRAMDirectory.java =================================================================== --- lucene/core/src/test/org/apache/lucene/store/TestRAMDirectory.java (revision 1304862) +++ lucene/core/src/test/org/apache/lucene/store/TestRAMDirectory.java (working copy) @@ -171,15 +171,16 @@ RAMDirectory dir = new RAMDirectory(); IndexOutput o = dir.createOutput("out", newIOContext(random)); - byte[] bytes = new byte[3*RAMInputStream.BUFFER_SIZE]; + final int bufferSize = dir.getBufferSize(); + byte[] bytes = new byte[3*bufferSize]; o.writeBytes(bytes, 0, bytes.length); o.close(); IndexInput i = dir.openInput("out", newIOContext(random)); - i.seek(2*RAMInputStream.BUFFER_SIZE-1); - i.seek(3*RAMInputStream.BUFFER_SIZE); - i.seek(RAMInputStream.BUFFER_SIZE); - i.readBytes(bytes, 0, 2*RAMInputStream.BUFFER_SIZE); + i.seek(2*bufferSize-1); + i.seek(3*bufferSize); + i.seek(bufferSize); + i.readBytes(bytes, 0, 2*bufferSize); i.close(); dir.close(); } Index: lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java =================================================================== --- lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java (revision 1304862) +++ lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java (working copy) @@ -431,7 +431,7 @@ if (delegate instanceof RAMDirectory) { RAMDirectory ramdir = (RAMDirectory) delegate; - RAMFile file = new RAMFile(ramdir); + RAMFile file = ramdir.newRAMFile(); RAMFile existing = ramdir.fileMap.get(name); // Enforce write once: @@ -440,7 +440,6 @@ else { if (existing!=null) { ramdir.sizeInBytes.getAndAdd(-existing.sizeInBytes); - existing.directory = null; } ramdir.fileMap.put(name, file); }