X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/backwards/src/test-framework/org/apache/lucene/store/MockIndexOutputWrapper.java diff --git a/lucene-java-3.5.0/lucene/backwards/src/test-framework/org/apache/lucene/store/MockIndexOutputWrapper.java b/lucene-java-3.5.0/lucene/backwards/src/test-framework/org/apache/lucene/store/MockIndexOutputWrapper.java new file mode 100644 index 0000000..0f93567 --- /dev/null +++ b/lucene-java-3.5.0/lucene/backwards/src/test-framework/org/apache/lucene/store/MockIndexOutputWrapper.java @@ -0,0 +1,159 @@ +package org.apache.lucene.store; + +/** + * 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. + */ + +import java.io.IOException; + +import org.apache.lucene.util.LuceneTestCase; + +/** + * Used by MockRAMDirectory to create an output stream that + * will throw an IOException on fake disk full, track max + * disk space actually used, and maybe throw random + * IOExceptions. + */ + +public class MockIndexOutputWrapper extends IndexOutput { + private MockDirectoryWrapper dir; + private final IndexOutput delegate; + private boolean first=true; + final String name; + + byte[] singleByte = new byte[1]; + + /** Construct an empty output buffer. */ + public MockIndexOutputWrapper(MockDirectoryWrapper dir, IndexOutput delegate, String name) { + this.dir = dir; + this.name = name; + this.delegate = delegate; + } + + @Override + public void close() throws IOException { + try { + dir.maybeThrowDeterministicException(); + } finally { + delegate.close(); + if (dir.trackDiskUsage) { + // Now compute actual disk usage & track the maxUsedSize + // in the MockDirectoryWrapper: + long size = dir.getRecomputedActualSizeInBytes(); + if (size > dir.maxUsedSize) { + dir.maxUsedSize = size; + } + } + dir.removeIndexOutput(this, name); + } + } + + @Override + public void flush() throws IOException { + dir.maybeThrowDeterministicException(); + delegate.flush(); + } + + @Override + public void writeByte(byte b) throws IOException { + singleByte[0] = b; + writeBytes(singleByte, 0, 1); + } + + @Override + public void writeBytes(byte[] b, int offset, int len) throws IOException { + long freeSpace = dir.maxSize == 0 ? 0 : dir.maxSize - dir.sizeInBytes(); + long realUsage = 0; + + // If MockRAMDir crashed since we were opened, then + // don't write anything: + if (dir.crashed) + throw new IOException("MockRAMDirectory was crashed; cannot write to " + name); + + // Enforce disk full: + if (dir.maxSize != 0 && freeSpace <= len) { + // Compute the real disk free. This will greatly slow + // down our test but makes it more accurate: + realUsage = dir.getRecomputedActualSizeInBytes(); + freeSpace = dir.maxSize - realUsage; + } + + if (dir.maxSize != 0 && freeSpace <= len) { + if (freeSpace > 0) { + realUsage += freeSpace; + delegate.writeBytes(b, offset, (int) freeSpace); + } + if (realUsage > dir.maxUsedSize) { + dir.maxUsedSize = realUsage; + } + String message = "fake disk full at " + dir.getRecomputedActualSizeInBytes() + " bytes when writing " + name + " (file length=" + delegate.length(); + if (freeSpace > 0) { + message += "; wrote " + freeSpace + " of " + len + " bytes"; + } + message += ")"; + if (LuceneTestCase.VERBOSE) { + System.out.println(Thread.currentThread().getName() + ": MDW: now throw fake disk full"); + new Throwable().printStackTrace(System.out); + } + throw new IOException(message); + } else { + if (dir.randomState.nextInt(200) == 0) { + final int half = len/2; + delegate.writeBytes(b, offset, half); + Thread.yield(); + delegate.writeBytes(b, offset+half, len-half); + } else { + delegate.writeBytes(b, offset, len); + } + } + + dir.maybeThrowDeterministicException(); + + if (first) { + // Maybe throw random exception; only do this on first + // write to a new file: + first = false; + dir.maybeThrowIOException(); + } + } + + @Override + public long getFilePointer() { + return delegate.getFilePointer(); + } + + @Override + public void seek(long pos) throws IOException { + delegate.seek(pos); + } + + @Override + public long length() throws IOException { + return delegate.length(); + } + + @Override + public void setLength(long length) throws IOException { + delegate.setLength(length); + } + + @Override + public void copyBytes(DataInput input, long numBytes) throws IOException { + delegate.copyBytes(input, numBytes); + // TODO: we may need to check disk full here as well + dir.maybeThrowDeterministicException(); + } +}