You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2012/10/01 16:42:45 UTC
svn commit: r1392360 - in /lucene/dev/trunk/solr: ./
core/src/java/org/apache/solr/core/ core/src/java/org/apache/solr/update/
Author: markrmiller
Date: Mon Oct 1 14:42:44 2012
New Revision: 1392360
URL: http://svn.apache.org/viewvc?rev=1392360&view=rev
Log:
SOLR-3861: Refactor SolrCoreState so that it's managed by SolrCore.
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrCoreState.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Oct 1 14:42:44 2012
@@ -68,6 +68,9 @@ Other Changes
* SOLR-3899: SolrCore should not log at warning level when the index directory
changes - it's an info event. (Tobias Bergman, Mark Miller)
+* SOLR-3861: Refactor SolrCoreState so that it's managed by SolrCore.
+ (Mark Miller, hossman)
+
================== 4.0.0 ==================
Versions of Major Components
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Mon Oct 1 14:42:44 2012
@@ -62,10 +62,13 @@ import org.apache.solr.search.QParserPlu
import org.apache.solr.search.SolrFieldCacheMBean;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.ValueSourceParser;
+import org.apache.solr.update.DefaultSolrCoreState;
import org.apache.solr.update.DirectUpdateHandler2;
+import org.apache.solr.update.SolrCoreState;
import org.apache.solr.update.SolrIndexWriter;
import org.apache.solr.update.UpdateHandler;
import org.apache.solr.update.VersionInfo;
+import org.apache.solr.update.SolrCoreState.IndexWriterCloser;
import org.apache.solr.update.processor.DistributedUpdateProcessorFactory;
import org.apache.solr.update.processor.LogUpdateProcessorFactory;
import org.apache.solr.update.processor.RunUpdateProcessorFactory;
@@ -140,6 +143,9 @@ public final class SolrCore implements S
private final IndexSchema schema;
private final String dataDir;
private final UpdateHandler updateHandler;
+ private final SolrCoreState solrCoreState;
+ private int solrCoreStateRefCnt = 1;
+
private final long startTime;
private final RequestHandlers reqHandlers;
private final Map<String,SearchComponent> searchComponents;
@@ -369,7 +375,8 @@ public final class SolrCore implements S
IndexSchema schema = new IndexSchema(config,
getSchema().getResourceName(), null);
- updateHandler.incref();
+ increfSolrCoreState();
+
SolrCore core = new SolrCore(getName(), getDataDir(), config,
schema, coreDescriptor, updateHandler, prev);
return core;
@@ -637,8 +644,10 @@ public final class SolrCore implements S
if (updateHandler == null) {
initDirectoryFactory();
+ solrCoreState = new DefaultSolrCoreState(getDirectoryFactory());
} else {
- directoryFactory = updateHandler.getSolrCoreState().getDirectoryFactory();
+ solrCoreState = updateHandler.getSolrCoreState();
+ directoryFactory = solrCoreState.getDirectoryFactory();
this.isReloaded = true;
}
@@ -790,6 +799,36 @@ public final class SolrCore implements S
map.put("", def);
return map;
}
+
+ public SolrCoreState getSolrCoreState() {
+ return solrCoreState;
+ }
+
+ private void increfSolrCoreState() {
+ synchronized (solrCoreState) {
+ if (solrCoreStateRefCnt == 0) {
+ throw new IllegalStateException("IndexWriter has been closed");
+ }
+ solrCoreStateRefCnt++;
+ }
+ }
+
+ private void decrefSolrCoreState(IndexWriterCloser closer) {
+ synchronized (solrCoreState) {
+
+ solrCoreStateRefCnt--;
+ if (solrCoreStateRefCnt == 0) {
+
+ try {
+ log.info("Closing SolrCoreState");
+ solrCoreState.close(closer);
+ } catch (Throwable t) {
+ log.error("Error closing SolrCoreState", t);
+ }
+
+ }
+ }
+ }
/**
* @return an update processor registered to the given name. Throw an exception if this chain is undefined
@@ -865,6 +904,21 @@ public final class SolrCore implements S
}
try {
+ if (null != updateHandler) {
+ updateHandler.close();
+ }
+ } catch (Throwable e) {
+ SolrException.log(log,e);
+ }
+
+
+ if (updateHandler instanceof IndexWriterCloser) {
+ decrefSolrCoreState((IndexWriterCloser)updateHandler);
+ } else {
+ decrefSolrCoreState(null);
+ }
+
+ try {
searcherExecutor.shutdown();
if (!searcherExecutor.awaitTermination(60, TimeUnit.SECONDS)) {
log.error("Timeout waiting for searchExecutor to terminate");
@@ -893,20 +947,17 @@ public final class SolrCore implements S
} catch (Throwable e) {
SolrException.log(log,e);
}
-
- try {
- if (null != updateHandler) {
- updateHandler.close();
- } else {
- if (null != directoryFactory) {
- // :HACK: normally we rely on updateHandler to do this,
- // but what if updateHandler failed to init?
+
+ synchronized (solrCoreState) {
+ if (solrCoreStateRefCnt == 0) {
+ try {
directoryFactory.close();
+ } catch (Throwable t) {
+ SolrException.log(log, t);
}
}
- } catch (Throwable e) {
- SolrException.log(log,e);
}
+
if( closeHooks != null ) {
for( CloseHook hook : closeHooks ) {
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java Mon Oct 1 14:42:44 2012
@@ -39,7 +39,6 @@ public final class DefaultSolrCoreState
// protects pauseWriter and writerFree
private final Object writerPauseLock = new Object();
- private int refCnt = 1;
private SolrIndexWriter indexWriter = null;
private DirectoryFactory directoryFactory;
@@ -56,6 +55,21 @@ public final class DefaultSolrCoreState
this.directoryFactory = directoryFactory;
}
+ private synchronized void closeIndexWriter(IndexWriterCloser closer) {
+ try {
+ log.info("SolrCoreState ref count has reached 0 - closing IndexWriter");
+ if (closer != null) {
+ log.info("closing IndexWriter with IndexWriterCloser");
+ closer.closeWriter(indexWriter);
+ } else if (indexWriter != null) {
+ log.info("closing IndexWriter...");
+ indexWriter.close();
+ }
+ } catch (Throwable t) {
+ log.error("Error during shutdown of writer.", t);
+ }
+ }
+
@Override
public synchronized RefCounted<IndexWriter> getIndexWriter(SolrCore core)
throws IOException {
@@ -76,17 +90,7 @@ public final class DefaultSolrCoreState
if (indexWriter == null) {
indexWriter = createMainIndexWriter(core, "DirectUpdateHandler2", false);
}
- if (refCntWriter == null) {
- refCntWriter = new RefCounted<IndexWriter>(indexWriter) {
- @Override
- public void close() {
- synchronized (writerPauseLock) {
- writerFree = true;
- writerPauseLock.notifyAll();
- }
- }
- };
- }
+ initRefCntWriter();
writerFree = false;
writerPauseLock.notifyAll();
refCntWriter.incref();
@@ -94,6 +98,20 @@ public final class DefaultSolrCoreState
}
}
+ private void initRefCntWriter() {
+ if (refCntWriter == null) {
+ refCntWriter = new RefCounted<IndexWriter>(indexWriter) {
+ @Override
+ public void close() {
+ synchronized (writerPauseLock) {
+ writerFree = true;
+ writerPauseLock.notifyAll();
+ }
+ }
+ };
+ }
+ }
+
@Override
public synchronized void newIndexWriter(SolrCore core, boolean rollback) throws IOException {
log.info("Creating new IndexWriter...");
@@ -143,46 +161,6 @@ public final class DefaultSolrCoreState
}
@Override
- public void decref(IndexWriterCloser closer) {
- synchronized (this) {
- refCnt--;
- if (refCnt == 0) {
- try {
- log.info("SolrCoreState ref count has reached 0 - closing IndexWriter");
- if (closer != null) {
- closer.closeWriter(indexWriter);
- } else if (indexWriter != null) {
- indexWriter.close();
- }
- } catch (Throwable t) {
- log.error("Error during shutdown of writer.", t);
- }
- try {
- directoryFactory.close();
- } catch (Throwable t) {
- log.error("Error during shutdown of directory factory.", t);
- }
- try {
- log.info("Closing SolrCoreState - canceling any ongoing recovery");
- cancelRecovery();
- } catch (Throwable t) {
- log.error("Error cancelling recovery", t);
- }
-
- closed = true;
- }
- }
- }
-
- @Override
- public synchronized void incref() {
- if (refCnt == 0) {
- throw new IllegalStateException("IndexWriter has been closed");
- }
- refCnt++;
- }
-
- @Override
public synchronized void rollbackIndexWriter(SolrCore core) throws IOException {
newIndexWriter(core, true);
}
@@ -269,5 +247,12 @@ public final class DefaultSolrCoreState
public void failed() {
recoveryRunning = false;
}
+
+ @Override
+ public synchronized void close(IndexWriterCloser closer) {
+ closed = true;
+ cancelRecovery();
+ closeIndexWriter(closer);
+ }
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java Mon Oct 1 14:42:44 2012
@@ -96,7 +96,7 @@ public class DirectUpdateHandler2 extend
public DirectUpdateHandler2(SolrCore core) {
super(core);
- solrCoreState = new DefaultSolrCoreState(core.getDirectoryFactory());
+ solrCoreState = core.getSolrCoreState();
UpdateHandlerInfo updateHandlerInfo = core.getSolrConfig()
.getUpdateHandlerInfo();
@@ -111,13 +111,7 @@ public class DirectUpdateHandler2 extend
public DirectUpdateHandler2(SolrCore core, UpdateHandler updateHandler) {
super(core);
- if (updateHandler instanceof DirectUpdateHandler2) {
- this.solrCoreState = ((DirectUpdateHandler2) updateHandler).solrCoreState;
- } else {
- // the impl has changed, so we cannot use the old state - decref it
- updateHandler.decref();
- solrCoreState = new DefaultSolrCoreState(core.getDirectoryFactory());
- }
+ solrCoreState = core.getSolrCoreState();
UpdateHandlerInfo updateHandlerInfo = core.getSolrConfig()
.getUpdateHandlerInfo();
@@ -658,8 +652,6 @@ public class DirectUpdateHandler2 extend
softCommitTracker.close();
numDocsPending.set(0);
-
- solrCoreState.decref(this);
}
@@ -817,20 +809,6 @@ public class DirectUpdateHandler2 extend
return solrCoreState;
}
- @Override
- public void decref() {
- try {
- solrCoreState.decref(this);
- } catch (IOException e) {
- throw new SolrException(ErrorCode.SERVER_ERROR, "", e);
- }
- }
-
- @Override
- public void incref() {
- solrCoreState.incref();
- }
-
// allow access for tests
public CommitTracker getCommitTracker() {
return commitTracker;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrCoreState.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrCoreState.java?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrCoreState.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrCoreState.java Mon Oct 1 14:42:44 2012
@@ -55,20 +55,6 @@ public abstract class SolrCoreState {
public abstract RefCounted<IndexWriter> getIndexWriter(SolrCore core) throws IOException;
/**
- * Decrement the number of references to this state. When then number of
- * references hits 0, the state will close. If an optional closer is
- * passed, that will be used to close the writer.
- *
- * @throws IOException If there is a low-level I/O error.
- */
- public abstract void decref(IndexWriterCloser closer) throws IOException;
-
- /**
- * Increment the number of references to this state.
- */
- public abstract void incref();
-
- /**
* Rollback the current IndexWriter. When creating the new IndexWriter use the
* settings from the given {@link SolrCore}.
*
@@ -90,4 +76,6 @@ public abstract class SolrCoreState {
public abstract void cancelRecovery();
+ public abstract void close(IndexWriterCloser closer);
+
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java Mon Oct 1 14:42:44 2012
@@ -60,7 +60,7 @@ public class SolrIndexWriter extends Ind
final Directory d = directoryFactory.get(path, config.lockType, forceNewDirectory);
try {
w = new SolrIndexWriter(name, path, d, create, schema,
- config, delPolicy, codec, forceNewDirectory);
+ config, delPolicy, codec);
w.setDirectoryFactory(directoryFactory);
return w;
} finally {
@@ -71,7 +71,7 @@ public class SolrIndexWriter extends Ind
}
}
- private SolrIndexWriter(String name, String path, Directory directory, boolean create, IndexSchema schema, SolrIndexConfig config, IndexDeletionPolicy delPolicy, Codec codec, boolean forceNewDirectory) throws IOException {
+ private SolrIndexWriter(String name, String path, Directory directory, boolean create, IndexSchema schema, SolrIndexConfig config, IndexDeletionPolicy delPolicy, Codec codec) throws IOException {
super(directory,
config.toIndexWriterConfig(schema).
setOpenMode(create ? IndexWriterConfig.OpenMode.CREATE : IndexWriterConfig.OpenMode.APPEND).
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateHandler.java?rev=1392360&r1=1392359&r2=1392360&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateHandler.java Mon Oct 1 14:42:44 2012
@@ -19,7 +19,6 @@ package org.apache.solr.update;
import java.io.IOException;
-import java.util.List;
import java.util.Vector;
import org.apache.solr.core.PluginInfo;
@@ -29,7 +28,6 @@ import org.apache.solr.core.SolrInfoMBea
import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
-import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,16 +55,6 @@ public abstract class UpdateHandler impl
protected UpdateLog ulog;
- /**
- * Called when a SolrCore using this UpdateHandler is closed.
- */
- public abstract void decref();
-
- /**
- * Called when this UpdateHandler is shared with another SolrCore.
- */
- public abstract void incref();
-
private void parseEventListeners() {
final Class<SolrEventListener> clazz = SolrEventListener.class;
final String label = "Event Listener";