mirror of https://github.com/apache/lucene.git
Change to RefCntRamDirectory rather than RamDirectory
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/branches/newtrunk@925620 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7576bfeb27
commit
55f589ae9e
|
@ -29,15 +29,17 @@ import java.util.HashMap;
|
||||||
* Directory provider for using lucene RAMDirectory
|
* Directory provider for using lucene RAMDirectory
|
||||||
*/
|
*/
|
||||||
public class RAMDirectoryFactory extends StandardDirectoryFactory {
|
public class RAMDirectoryFactory extends StandardDirectoryFactory {
|
||||||
private Map<String, Directory> directories = new HashMap<String, Directory>();
|
private Map<String, RefCntRamDirectory> directories = new HashMap<String, RefCntRamDirectory>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Directory open(String path) throws IOException {
|
public Directory open(String path) throws IOException {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
Directory directory = directories.get(path);
|
RefCntRamDirectory directory = directories.get(path);
|
||||||
if (directory == null) {
|
if (directory == null || !directory.isOpen()) {
|
||||||
directory = openNew(path);
|
directory = (RefCntRamDirectory) openNew(path);
|
||||||
directories.put(path, directory);
|
directories.put(path, directory);
|
||||||
|
} else {
|
||||||
|
directory.incRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
return directory;
|
return directory;
|
||||||
|
@ -53,9 +55,9 @@ public class RAMDirectoryFactory extends StandardDirectoryFactory {
|
||||||
boolean indexExists = dirFile.canRead();
|
boolean indexExists = dirFile.canRead();
|
||||||
if (indexExists) {
|
if (indexExists) {
|
||||||
Directory dir = super.open(path);
|
Directory dir = super.open(path);
|
||||||
directory = new RAMDirectory(dir);
|
directory = new RefCntRamDirectory(dir);
|
||||||
} else {
|
} else {
|
||||||
directory = new RAMDirectory();
|
directory = new RefCntRamDirectory();
|
||||||
}
|
}
|
||||||
return directory;
|
return directory;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
package org.apache.solr.core;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
import org.apache.lucene.store.Directory;
|
||||||
|
import org.apache.lucene.store.RAMDirectory;
|
||||||
|
|
||||||
|
public class RefCntRamDirectory extends RAMDirectory {
|
||||||
|
|
||||||
|
private final AtomicInteger refCount = new AtomicInteger();
|
||||||
|
|
||||||
|
public RefCntRamDirectory() {
|
||||||
|
super();
|
||||||
|
incRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
public RefCntRamDirectory(Directory dir) throws IOException {
|
||||||
|
this();
|
||||||
|
Directory.copy(dir, this, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void incRef() {
|
||||||
|
ensureOpen();
|
||||||
|
refCount.incrementAndGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decRef() {
|
||||||
|
ensureOpen();
|
||||||
|
if (refCount.getAndDecrement() == 1) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final synchronized void close() {
|
||||||
|
if (isOpen) {
|
||||||
|
decRef();
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOpen() {
|
||||||
|
return isOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue