mirror of https://github.com/apache/lucene.git
SOLR-4413: Fix SolrCore#getIndexDir() to return the current index directory.
SOLR-4469: A new IndexWriter must be opened on SolrCore reload when the index directory has changed and the previous SolrCore's state should not be propagated. git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1447089 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d51e6f2c29
commit
d3accc58e6
|
@ -139,6 +139,13 @@ Bug Fixes
|
||||||
* SOLR-4467: Ephemeral directory implementations may not recover correctly
|
* SOLR-4467: Ephemeral directory implementations may not recover correctly
|
||||||
because the code to clear the tlog files on startup is off. (Mark Miller)
|
because the code to clear the tlog files on startup is off. (Mark Miller)
|
||||||
|
|
||||||
|
* SOLR-4413: Fix SolrCore#getIndexDir() to return the current index directory.
|
||||||
|
(Gregg Donovan, Mark Miller)
|
||||||
|
|
||||||
|
* SOLR-4469: A new IndexWriter must be opened on SolrCore reload when the index
|
||||||
|
directory has changed and the previous SolrCore's state should not be
|
||||||
|
propagated. (Mark Miller, Gregg Donovan)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|
|
@ -218,8 +218,13 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
return dataDir;
|
return dataDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIndexDir() {
|
public String getIndexDir() {
|
||||||
return dataDir + "index/";
|
synchronized (searcherLock) {
|
||||||
|
if (_searcher == null) return getNewIndexDir();
|
||||||
|
SolrIndexSearcher searcher = _searcher.get();
|
||||||
|
return searcher.getPath() == null ? dataDir + "index/" : searcher
|
||||||
|
.getPath();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -395,6 +400,11 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
|
|
||||||
solrCoreState.increfSolrCoreState();
|
solrCoreState.increfSolrCoreState();
|
||||||
|
|
||||||
|
if (!getNewIndexDir().equals(getIndexDir())) {
|
||||||
|
// the directory is changing, don't pass on state
|
||||||
|
prev = null;
|
||||||
|
}
|
||||||
|
|
||||||
SolrCore core = new SolrCore(getName(), getDataDir(), config,
|
SolrCore core = new SolrCore(getName(), getDataDir(), config,
|
||||||
schema, coreDescriptor, updateHandler, prev);
|
schema, coreDescriptor, updateHandler, prev);
|
||||||
core.solrDelPolicy = this.solrDelPolicy;
|
core.solrDelPolicy = this.solrDelPolicy;
|
||||||
|
@ -1364,7 +1374,7 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
}
|
}
|
||||||
|
|
||||||
// for now, turn off caches if this is for a realtime reader (caches take a little while to instantiate)
|
// for now, turn off caches if this is for a realtime reader (caches take a little while to instantiate)
|
||||||
tmp = new SolrIndexSearcher(this, schema, (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
|
tmp = new SolrIndexSearcher(this, newIndexDir, schema, (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// newestSearcher == null at this point
|
// newestSearcher == null at this point
|
||||||
|
@ -1374,7 +1384,7 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
// so that we pick up any uncommitted changes and so we don't go backwards
|
// so that we pick up any uncommitted changes and so we don't go backwards
|
||||||
// in time on a core reload
|
// in time on a core reload
|
||||||
DirectoryReader newReader = newReaderCreator.call();
|
DirectoryReader newReader = newReaderCreator.call();
|
||||||
tmp = new SolrIndexSearcher(this, schema, (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
|
tmp = new SolrIndexSearcher(this, newIndexDir, schema, (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
|
||||||
} else {
|
} else {
|
||||||
// normal open that happens at startup
|
// normal open that happens at startup
|
||||||
// verbose("non-reopen START:");
|
// verbose("non-reopen START:");
|
||||||
|
|
|
@ -103,7 +103,7 @@ public class SnapShooter {
|
||||||
Collection<String> files = indexCommit.getFileNames();
|
Collection<String> files = indexCommit.getFileNames();
|
||||||
FileCopier fileCopier = new FileCopier();
|
FileCopier fileCopier = new FileCopier();
|
||||||
|
|
||||||
Directory dir = solrCore.getDirectoryFactory().get(solrCore.getNewIndexDir(), DirContext.DEFAULT, solrCore.getSolrConfig().indexConfig.lockType);
|
Directory dir = solrCore.getDirectoryFactory().get(solrCore.getIndexDir(), DirContext.DEFAULT, solrCore.getSolrConfig().indexConfig.lockType);
|
||||||
try {
|
try {
|
||||||
fileCopier.copyFiles(dir, files, snapShotDir);
|
fileCopier.copyFiles(dir, files, snapShotDir);
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
@ -610,13 +610,17 @@ public class CoreAdminHandler extends RequestHandlerBase {
|
||||||
}
|
}
|
||||||
if (params.getBool(CoreAdminParams.DELETE_INDEX, false)) {
|
if (params.getBool(CoreAdminParams.DELETE_INDEX, false)) {
|
||||||
core.addCloseHook(new CloseHook() {
|
core.addCloseHook(new CloseHook() {
|
||||||
|
private String indexDir;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preClose(SolrCore core) {}
|
public void preClose(SolrCore core) {
|
||||||
|
indexDir = core.getIndexDir();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postClose(SolrCore core) {
|
public void postClose(SolrCore core) {
|
||||||
try {
|
try {
|
||||||
core.getDirectoryFactory().remove(core.getIndexDir());
|
core.getDirectoryFactory().remove(indexDir);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
@ -1026,11 +1030,8 @@ public class CoreAdminHandler extends RequestHandlerBase {
|
||||||
Directory dir;
|
Directory dir;
|
||||||
long size = 0;
|
long size = 0;
|
||||||
try {
|
try {
|
||||||
if (!core.getDirectoryFactory().exists(core.getIndexDir())) {
|
|
||||||
dir = core.getDirectoryFactory().get(core.getNewIndexDir(), DirContext.DEFAULT, core.getSolrConfig().indexConfig.lockType);
|
dir = core.getDirectoryFactory().get(core.getIndexDir(), DirContext.DEFAULT, core.getSolrConfig().indexConfig.lockType);
|
||||||
} else {
|
|
||||||
dir = core.getDirectoryFactory().get(core.getIndexDir(), DirContext.DEFAULT, core.getSolrConfig().indexConfig.lockType);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
size = DirectoryFactory.sizeOfDirectory(dir);
|
size = DirectoryFactory.sizeOfDirectory(dir);
|
||||||
|
|
|
@ -116,27 +116,17 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable,SolrIn
|
||||||
private Collection<String> storedHighlightFieldNames;
|
private Collection<String> storedHighlightFieldNames;
|
||||||
private DirectoryFactory directoryFactory;
|
private DirectoryFactory directoryFactory;
|
||||||
|
|
||||||
private final AtomicReader atomicReader;
|
private final AtomicReader atomicReader;
|
||||||
|
private String path;
|
||||||
|
|
||||||
public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, SolrIndexConfig config, String name, boolean enableCache, DirectoryFactory directoryFactory) throws IOException {
|
public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, SolrIndexConfig config, String name, boolean enableCache, DirectoryFactory directoryFactory) throws IOException {
|
||||||
// we don't need to reserve the directory because we get it from the factory
|
// we don't need to reserve the directory because we get it from the factory
|
||||||
this(core, schema,name, core.getIndexReaderFactory().newReader(directoryFactory.get(path, DirContext.DEFAULT, config.lockType), core), true, enableCache, false, directoryFactory);
|
this(core, path, schema,name, core.getIndexReaderFactory().newReader(directoryFactory.get(path, DirContext.DEFAULT, config.lockType), core), true, enableCache, false, directoryFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getIndexDir(Directory dir) {
|
public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, String name, DirectoryReader r, boolean closeReader, boolean enableCache, boolean reserveDirectory, DirectoryFactory directoryFactory) throws IOException {
|
||||||
if (dir instanceof FSDirectory) {
|
|
||||||
return ((FSDirectory)dir).getDirectory().getAbsolutePath();
|
|
||||||
} else if (dir instanceof NRTCachingDirectory) {
|
|
||||||
// recurse on the delegate
|
|
||||||
return getIndexDir(((NRTCachingDirectory) dir).getDelegate());
|
|
||||||
} else {
|
|
||||||
log.warn("WARNING: Directory impl does not support setting indexDir: " + dir.getClass().getName());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SolrIndexSearcher(SolrCore core, IndexSchema schema, String name, DirectoryReader r, boolean closeReader, boolean enableCache, boolean reserveDirectory, DirectoryFactory directoryFactory) throws IOException {
|
|
||||||
super(r);
|
super(r);
|
||||||
|
this.path = path;
|
||||||
this.directoryFactory = directoryFactory;
|
this.directoryFactory = directoryFactory;
|
||||||
this.reader = r;
|
this.reader = r;
|
||||||
this.atomicReader = SlowCompositeReaderWrapper.wrap(r);
|
this.atomicReader = SlowCompositeReaderWrapper.wrap(r);
|
||||||
|
@ -210,6 +200,10 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable,SolrIn
|
||||||
// do this at the end since an exception in the constructor means we won't close
|
// do this at the end since an exception in the constructor means we won't close
|
||||||
numOpens.incrementAndGet();
|
numOpens.incrementAndGet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
Loading…
Reference in New Issue