mirror of https://github.com/apache/lucene.git
LUCENE-7345: RAMDirectory now enforces write-once as well
This commit is contained in:
parent
4c630b2216
commit
c311eb1b7e
|
@ -55,6 +55,9 @@ Improvements
|
|||
module into core and is now the default analyzer in
|
||||
IndexWriterConfig (Robert Muir, Mike McCandless)
|
||||
|
||||
* LUCENE-7345: RAMDirectory now enforces write-once files as well
|
||||
(Robert Muir, Mike McCandless)
|
||||
|
||||
Optimizations
|
||||
|
||||
* LUCENE-7330: Speed up conjunction queries. (Adrien Grand)
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.lucene.store;
|
|||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileAlreadyExistsException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
@ -177,12 +178,9 @@ public class RAMDirectory extends BaseDirectory implements Accountable {
|
|||
public IndexOutput createOutput(String name, IOContext context) throws IOException {
|
||||
ensureOpen();
|
||||
RAMFile file = newRAMFile();
|
||||
RAMFile existing = fileMap.remove(name);
|
||||
if (existing != null) {
|
||||
sizeInBytes.addAndGet(-existing.sizeInBytes);
|
||||
existing.directory = null;
|
||||
if (fileMap.putIfAbsent(name, file) != null) {
|
||||
throw new FileAlreadyExistsException(name);
|
||||
}
|
||||
fileMap.put(name, file);
|
||||
return new RAMOutputStream(name, file, true);
|
||||
}
|
||||
|
||||
|
@ -222,7 +220,12 @@ public class RAMDirectory extends BaseDirectory implements Accountable {
|
|||
if (file == null) {
|
||||
throw new FileNotFoundException(source);
|
||||
}
|
||||
fileMap.put(dest, file);
|
||||
if (fileMap.putIfAbsent(dest, file) != null) {
|
||||
throw new FileAlreadyExistsException(dest);
|
||||
}
|
||||
if (!fileMap.remove(source, file)) {
|
||||
throw new IllegalStateException("file was unexpectedly replaced: " + source);
|
||||
}
|
||||
fileMap.remove(source);
|
||||
}
|
||||
|
||||
|
|
|
@ -636,22 +636,6 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
|
|||
unSyncedFiles.add(name);
|
||||
createdFiles.add(name);
|
||||
|
||||
if (in instanceof RAMDirectory) {
|
||||
RAMDirectory ramdir = (RAMDirectory) in;
|
||||
RAMFile file = new RAMFile(ramdir);
|
||||
RAMFile existing = ramdir.fileMap.get(name);
|
||||
|
||||
// Enforce write once:
|
||||
if (existing!=null && !name.equals("segments.gen")) {
|
||||
throw new IOException("file " + name + " already exists");
|
||||
} else {
|
||||
if (existing!=null) {
|
||||
ramdir.sizeInBytes.getAndAdd(-existing.sizeInBytes);
|
||||
existing.directory = null;
|
||||
}
|
||||
ramdir.fileMap.put(name, file);
|
||||
}
|
||||
}
|
||||
//System.out.println(Thread.currentThread().getName() + ": MDW: create " + name);
|
||||
IndexOutput delegateOutput = in.createOutput(name, LuceneTestCase.newIOContext(randomState, context));
|
||||
final IndexOutput io = new MockIndexOutputWrapper(this, delegateOutput, name);
|
||||
|
|
Loading…
Reference in New Issue