You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2017/02/28 17:27:14 UTC
[47/50] [abbrv] lucene-solr:jira/solr-9045: Merge remote-tracking
branch 'origin/master' into jira/solr-9045
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e753977c/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
index b99e739,3bd2e74..a774630
--- a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
@@@ -68,37 -66,13 +69,37 @@@ import org.apache.zookeeper.KeeperExcep
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+/**
+ * This class may change in future and customisations are not supported
+ * between versions in terms of API or back compat behaviour.
+ * @lucene.experimental
+ */
public class RecoveryStrategy extends Thread implements Closeable {
+ public static class Builder implements NamedListInitializedPlugin {
+ private NamedList args;
+ @Override
+ public void init(NamedList args) {
+ this.args = args;
+ }
+ // this should only be used from SolrCoreState
+ public RecoveryStrategy create(CoreContainer cc, CoreDescriptor cd,
+ RecoveryStrategy.RecoveryListener recoveryListener) {
+ final RecoveryStrategy recoveryStrategy = newRecoveryStrategy(cc, cd, recoveryListener);
+ SolrPluginUtils.invokeSetters(recoveryStrategy, args);
+ return recoveryStrategy;
+ }
+ protected RecoveryStrategy newRecoveryStrategy(CoreContainer cc, CoreDescriptor cd,
+ RecoveryStrategy.RecoveryListener recoveryListener) {
+ return new RecoveryStrategy(cc, cd, recoveryListener);
+ }
+ }
+
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
- private int waitForUpdatesWithStaleStatePauseMilliSeconds = Integer.getInteger("solr.cloud.wait-for-updates-with-stale-state-pause", 7000);
- private static final int WAIT_FOR_UPDATES_WITH_STALE_STATE_PAUSE = Integer.getInteger("solr.cloud.wait-for-updates-with-stale-state-pause", 2500);
- private static final int MAX_RETRIES = 500;
- private static final int STARTING_RECOVERY_DELAY = 5000;
++ private int waitForUpdatesWithStaleStatePauseMilliSeconds = Integer.getInteger("solr.cloud.wait-for-updates-with-stale-state-pause", 2500);
+ private int maxRetries = 500;
+ private int startingRecoveryDelayMilliSeconds = 5000;
public static interface RecoveryListener {
public void recovered();
@@@ -631,27 -570,49 +632,49 @@@
return close;
}
- private void sendPrepRecoveryCmd(String leaderBaseUrl, String leaderCoreName, Slice slice)
+ final private void sendPrepRecoveryCmd(String leaderBaseUrl, String leaderCoreName, Slice slice)
throws SolrServerException, IOException, InterruptedException, ExecutionException {
- try (HttpSolrClient client = new HttpSolrClient.Builder(leaderBaseUrl).build()) {
- client.setConnectionTimeout(30000);
- WaitForState prepCmd = new WaitForState();
- prepCmd.setCoreName(leaderCoreName);
- prepCmd.setNodeName(zkController.getNodeName());
- prepCmd.setCoreNodeName(coreZkNodeName);
- prepCmd.setState(Replica.State.RECOVERING);
- prepCmd.setCheckLive(true);
- prepCmd.setOnlyIfLeader(true);
- final Slice.State state = slice.getState();
- if (state != Slice.State.CONSTRUCTION && state != Slice.State.RECOVERY) {
- prepCmd.setOnlyIfLeaderActive(true);
+ WaitForState prepCmd = new WaitForState();
+ prepCmd.setCoreName(leaderCoreName);
+ prepCmd.setNodeName(zkController.getNodeName());
+ prepCmd.setCoreNodeName(coreZkNodeName);
+ prepCmd.setState(Replica.State.RECOVERING);
+ prepCmd.setCheckLive(true);
+ prepCmd.setOnlyIfLeader(true);
+ final Slice.State state = slice.getState();
+ if (state != Slice.State.CONSTRUCTION && state != Slice.State.RECOVERY && state != Slice.State.RECOVERY_FAILED) {
+ prepCmd.setOnlyIfLeaderActive(true);
+ }
+
+ final int maxTries = 30;
+ for (int numTries = 0; numTries < maxTries; numTries++) {
+ try {
+ sendPrepRecoveryCmd(leaderBaseUrl, prepCmd);
+ break;
+ } catch (ExecutionException e) {
+ if (e.getCause() instanceof SolrServerException) {
+ SolrServerException solrException = (SolrServerException) e.getCause();
+ if (solrException.getRootCause() instanceof SocketTimeoutException && numTries < maxTries) {
+ LOG.warn("Socket timeout on send prep recovery cmd, retrying.. ");
+ continue;
+ }
+ }
+ throw e;
}
+ }
+ }
+
+ private void sendPrepRecoveryCmd(String leaderBaseUrl, WaitForState prepCmd)
+ throws SolrServerException, IOException, InterruptedException, ExecutionException {
+ try (HttpSolrClient client = new HttpSolrClient.Builder(leaderBaseUrl).build()) {
+ client.setConnectionTimeout(10000);
+ client.setSoTimeout(10000);
HttpUriRequestResponse mrr = client.httpUriRequest(prepCmd);
prevSendPreRecoveryHttpUriRequest = mrr.httpUriRequest;
-
+
LOG.info("Sending prep recovery command to [{}]; [{}]", leaderBaseUrl, prepCmd.toString());
-
+
mrr.future.get();
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e753977c/solr/core/src/java/org/apache/solr/core/SolrConfig.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/core/SolrConfig.java
index 0020766,bd98075..a244420
--- a/solr/core/src/java/org/apache/solr/core/SolrConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrConfig.java
@@@ -36,8 -57,9 +57,10 @@@ import javax.xml.xpath.XPathConstants
import org.apache.lucene.index.IndexDeletionPolicy;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.util.Version;
+ import org.apache.solr.client.solrj.io.stream.expr.Expressible;
+import org.apache.solr.cloud.RecoveryStrategy;
import org.apache.solr.cloud.ZkSolrResourceLoader;
+ import org.apache.solr.common.MapSerializable;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.util.IOUtils;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e753977c/solr/core/src/java/org/apache/solr/core/SolrCore.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/core/SolrCore.java
index c2891cc,1c30e4c..f3b293f
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@@ -154,12 -196,13 +197,14 @@@ public final class SolrCore implements
private final long startNanoTime = System.nanoTime();
private final RequestHandlers reqHandlers;
private final PluginBag<SearchComponent> searchComponents = new PluginBag<>(SearchComponent.class, this);
- private final PluginBag<UpdateRequestProcessorFactory> updateProcessors = new PluginBag<>(UpdateRequestProcessorFactory.class, this);
+ private final PluginBag<UpdateRequestProcessorFactory> updateProcessors = new PluginBag<>(UpdateRequestProcessorFactory.class, this, true);
private final Map<String,UpdateRequestProcessorChain> updateProcessorChains;
+ private final SolrCoreMetricManager coreMetricManager;
private final Map<String, SolrInfoMBean> infoRegistry;
private final IndexDeletionPolicyWrapper solrDelPolicy;
+ private final SolrSnapshotMetaDataManager snapshotMgr;
private final DirectoryFactory directoryFactory;
+ private final RecoveryStrategy.Builder recoveryStrategyBuilder;
private IndexReaderFactory indexReaderFactory;
private final Codec codec;
private final MemClassLoader memClassLoader;
@@@ -479,38 -654,9 +656,25 @@@
}
private DirectoryFactory initDirectoryFactory() {
- final PluginInfo info = solrConfig.getPluginInfo(DirectoryFactory.class.getName());
- final DirectoryFactory dirFactory;
- if (info != null) {
- log.info(info.className);
- dirFactory = getResourceLoader().newInstance(info.className, DirectoryFactory.class);
- // allow DirectoryFactory instances to access the CoreContainer
- dirFactory.initCoreContainer(getCoreDescriptor().getCoreContainer());
- dirFactory.init(info.initArgs);
- } else {
- log.info("solr.NRTCachingDirectoryFactory");
- dirFactory = new NRTCachingDirectoryFactory();
- dirFactory.initCoreContainer(getCoreDescriptor().getCoreContainer());
- }
- return dirFactory;
+ return DirectoryFactory.loadDirectoryFactory(solrConfig, getCoreDescriptor().getCoreContainer(), coreMetricManager.getRegistryName());
}
+ private RecoveryStrategy.Builder initRecoveryStrategyBuilder() {
+ final PluginInfo info = solrConfig.getPluginInfo(RecoveryStrategy.Builder.class.getName());
+ final RecoveryStrategy.Builder rsBuilder;
+ if (info != null && info.className != null) {
+ log.info(info.className);
+ rsBuilder = getResourceLoader().newInstance(info.className, RecoveryStrategy.Builder.class);
+ } else {
+ log.info("solr.RecoveryStrategy.Builder");
+ rsBuilder = new RecoveryStrategy.Builder();
+ }
+ if (info != null) {
+ rsBuilder.init(info.initArgs);
+ }
+ return rsBuilder;
+ }
+
private void initIndexReaderFactory() {
IndexReaderFactory indexReaderFactory;
PluginInfo info = solrConfig.getPluginInfo(IndexReaderFactory.class.getName());
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e753977c/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e753977c/solr/core/src/java/org/apache/solr/update/SolrCoreState.java
----------------------------------------------------------------------