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
----------------------------------------------------------------------