mirror of https://github.com/apache/lucene.git
LUCENE-1640: fix MockRAMDir's internal synchronization (used only by unit tests)
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@776053 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
571a058767
commit
af71c1829d
|
@ -54,7 +54,7 @@ public class MockRAMDirectory extends RAMDirectory {
|
|||
// like super is called, then our members are initialized:
|
||||
Map openFiles;
|
||||
|
||||
private void init() {
|
||||
private synchronized void init() {
|
||||
if (openFiles == null)
|
||||
openFiles = new HashMap();
|
||||
if (createdFiles == null)
|
||||
|
@ -96,11 +96,9 @@ public class MockRAMDirectory extends RAMDirectory {
|
|||
|
||||
/** Simulates a crash of OS or machine by overwriting
|
||||
* unsycned files. */
|
||||
public void crash() throws IOException {
|
||||
synchronized(this) {
|
||||
public synchronized void crash() throws IOException {
|
||||
crashed = true;
|
||||
openFiles = new HashMap();
|
||||
}
|
||||
Iterator it = unSyncedFiles.iterator();
|
||||
unSyncedFiles = new HashSet();
|
||||
int count = 0;
|
||||
|
@ -195,27 +193,22 @@ public class MockRAMDirectory extends RAMDirectory {
|
|||
if (unSyncedFiles.contains(name))
|
||||
unSyncedFiles.remove(name);
|
||||
if (!forced) {
|
||||
synchronized(openFiles) {
|
||||
if (noDeleteOpenFile && openFiles.containsKey(name)) {
|
||||
throw new IOException("MockRAMDirectory: file \"" + name + "\" is still open: cannot delete");
|
||||
}
|
||||
}
|
||||
}
|
||||
super.deleteFile(name);
|
||||
}
|
||||
|
||||
public IndexOutput createOutput(String name) throws IOException {
|
||||
public synchronized IndexOutput createOutput(String name) throws IOException {
|
||||
if (crashed)
|
||||
throw new IOException("cannot createOutput after crash");
|
||||
init();
|
||||
synchronized(openFiles) {
|
||||
if (preventDoubleWrite && createdFiles.contains(name) && !name.equals("segments.gen"))
|
||||
throw new IOException("file \"" + name + "\" was already written to");
|
||||
if (noDeleteOpenFile && openFiles.containsKey(name))
|
||||
throw new IOException("MockRAMDirectory: file \"" + name + "\" is still open: cannot overwrite");
|
||||
}
|
||||
RAMFile file = new RAMFile(this);
|
||||
synchronized (this) {
|
||||
if (crashed)
|
||||
throw new IOException("cannot createOutput after crash");
|
||||
unSyncedFiles.add(name);
|
||||
|
@ -232,20 +225,15 @@ public class MockRAMDirectory extends RAMDirectory {
|
|||
|
||||
fileMap.put(name, file);
|
||||
}
|
||||
}
|
||||
|
||||
return new MockRAMOutputStream(this, file, name);
|
||||
}
|
||||
|
||||
public IndexInput openInput(String name) throws IOException {
|
||||
RAMFile file;
|
||||
synchronized (this) {
|
||||
file = (RAMFile)fileMap.get(name);
|
||||
}
|
||||
public synchronized IndexInput openInput(String name) throws IOException {
|
||||
RAMFile file = (RAMFile)fileMap.get(name);
|
||||
if (file == null)
|
||||
throw new FileNotFoundException(name);
|
||||
else {
|
||||
synchronized(openFiles) {
|
||||
if (openFiles.containsKey(name)) {
|
||||
Integer v = (Integer) openFiles.get(name);
|
||||
v = new Integer(v.intValue()+1);
|
||||
|
@ -254,7 +242,6 @@ public class MockRAMDirectory extends RAMDirectory {
|
|||
openFiles.put(name, new Integer(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
return new MockRAMInputStream(this, name, file);
|
||||
}
|
||||
|
||||
|
@ -281,18 +268,16 @@ public class MockRAMDirectory extends RAMDirectory {
|
|||
return size;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
public synchronized void close() {
|
||||
if (openFiles == null) {
|
||||
openFiles = new HashMap();
|
||||
}
|
||||
synchronized(openFiles) {
|
||||
if (noDeleteOpenFile && openFiles.size() > 0) {
|
||||
// RuntimeException instead of IOException because
|
||||
// super() does not throw IOException currently:
|
||||
throw new RuntimeException("MockRAMDirectory: cannot close: there are still open files: " + openFiles);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Objects that represent fail-able conditions. Objects of a derived
|
||||
|
|
|
@ -43,7 +43,7 @@ public class MockRAMInputStream extends RAMInputStream {
|
|||
// remove the conditional check so we also track that
|
||||
// all clones get closed:
|
||||
if (!isClone) {
|
||||
synchronized(dir.openFiles) {
|
||||
synchronized(dir) {
|
||||
Integer v = (Integer) dir.openFiles.get(name);
|
||||
// Could be null when MockRAMDirectory.crash() was called
|
||||
if (v != null) {
|
||||
|
|
Loading…
Reference in New Issue