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 2020/07/30 05:53:28 UTC

[lucene-solr] 03/03: @462 Make managed schema reloading a little less whacko.

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 30c372b1b5f6ee16748718a47939b3580c4c5efe
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Jul 30 00:52:50 2020 -0500

    @462 Make managed schema reloading a little less whacko.
---
 .../cloud/OverseerConfigSetMessageHandler.java     |  2 +-
 .../apache/solr/cloud/ZkSolrResourceLoader.java    |  1 +
 .../org/apache/solr/core/ConfigSetService.java     |  7 ++-
 .../java/org/apache/solr/core/CoreContainer.java   |  2 +-
 .../src/java/org/apache/solr/core/SolrCore.java    | 11 ++---
 .../org/apache/solr/handler/SolrConfigHandler.java | 55 +++++++++++++---------
 .../configsets/cloud-managed/conf/managed-schema   |  4 +-
 .../org/apache/solr/handler/TestReqParamsAPI.java  |  6 +++
 8 files changed, 56 insertions(+), 32 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java
index 13b0d6d..9970d666 100644
--- a/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java
@@ -279,7 +279,7 @@ public class OverseerConfigSetMessageHandler implements OverseerMessageHandler {
       }
       return propertyDataStr.getBytes(StandardCharsets.UTF_8);
     }
-    return null;
+    return ZkStateReader.emptyJson;
   }
 
   private String getPropertyPath(String configName, String propertyPath) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java b/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java
index 33b965c..fcb38a6 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java
@@ -75,6 +75,7 @@ public class ZkSolrResourceLoader extends SolrResourceLoader implements Resource
     InputStream is;
     String file = (".".equals(resource)) ? configSetZkPath : configSetZkPath + "/" + resource;
 
+
     try {
 
       Stat stat = new Stat();
diff --git a/solr/core/src/java/org/apache/solr/core/ConfigSetService.java b/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
index 9734811..6a4d07f 100644
--- a/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
+++ b/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
@@ -72,7 +72,12 @@ public abstract class ConfigSetService {
       // ConfigSet properties are loaded from ConfigSetProperties.DEFAULT_FILENAME file.
       NamedList properties = loadConfigSetProperties(dcore, coreLoader);
       // ConfigSet flags are loaded from the metadata of the ZK node of the configset.
-      NamedList flags = loadConfigSetFlags(dcore, coreLoader);
+      NamedList flags = null;
+      try {
+        flags = loadConfigSetFlags(dcore, coreLoader);
+      } catch (Exception e) {
+        ParWork.propegateInterrupt(e);
+      }
 
       boolean trusted =
           (coreLoader instanceof ZkSolrResourceLoader
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index 7b74150..3a858c4 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -1642,7 +1642,7 @@ public class CoreContainer implements Closeable {
       Closeable oldCore = null;
       boolean success = false;
       try {
-        solrCores.waitAddPendingCoreOps(cd.getName());
+        solrCores.waitForLoadingCoreToFinish(cd.getName(), 15000);
         ConfigSet coreConfig = coreConfigService.loadConfigSet(cd);
         log.info("Reloading SolrCore '{}' using configuration from {}", cd.getName(), coreConfig.getName());
         newCore = core.reload(coreConfig);
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index ae5e279..a985675 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -3163,19 +3163,19 @@ public final class SolrCore implements SolrInfoBean, Closeable {
           checkStale(zkClient, managedSchmaResourcePath, managedSchemaVersion)) {
         log.info("core reload {}", coreName);
         SolrConfigHandler configHandler = ((SolrConfigHandler) core.getRequestHandler("/config"));
-        if (configHandler.getReloadLock().tryLock()) {
+    //    if (configHandler.getReloadLock().tryLock()) {
 
           try {
             cc.reload(coreName);
           } catch (SolrCoreState.CoreIsClosedException e) {
             /*no problem this core is already closed*/
           } finally {
-            configHandler.getReloadLock().unlock();
+          //  configHandler.getReloadLock().unlock();
           }
 
-        } else {
-          log.info("Another reload is in progress. Not doing anything.");
-        }
+//        } else {
+//          log.info("Another reload is in progress. Not doing anything.");
+//        }
         return;
       }
       //some files in conf directory may have  other than managedschema, overlay, params
@@ -3187,7 +3187,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
               try {
                 listener.run();
               } catch (Exception e) {
-                ParWork.propegateInterrupt(e);
                 ParWork.propegateInterrupt("Error in listener ", e);
               }
             });
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index eee36ae..45e03ea 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -108,12 +108,11 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
   public static final String CONFIGSET_EDITING_DISABLED_ARG = "disable.configEdit";
   public static final boolean configEditing_disabled = Boolean.getBoolean(CONFIGSET_EDITING_DISABLED_ARG);
   private static final Map<String, SolrConfig.SolrPluginInfo> namedPlugins;
-  private Lock reloadLock = new ReentrantLock(true);
-  private HttpClient httpClient;
+ // private Lock reloadLock = new ReentrantLock(true);
 
-  public Lock getReloadLock() {
-    return reloadLock;
-  }
+//  //public Lock getReloadLock() {
+//    return reloadLock;
+//  }
 
   private boolean isImmutableConfigSet = false;
 
@@ -151,7 +150,6 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
   @Override
   public void inform(SolrCore core) {
     isImmutableConfigSet = getImmutable(core);
-    this.httpClient = core.getCoreContainer().getUpdateShardHandler().getDefaultHttpClient();
   }
 
   public static boolean getImmutable(SolrCore core) {
@@ -229,21 +227,35 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
               log.info("I already have the expected version {} of params", expectedVersion);
             }
             if (isStale && req.getCore().getResourceLoader() instanceof ZkSolrResourceLoader) {
-              new Thread(() -> {
-                if (!reloadLock.tryLock()) {
-                  log.info("Another reload is in progress . Not doing anything");
-                  return;
-                }
-                try {
-                  log.info("Trying to update my configs");
-                  SolrCore.getConfListener(req.getCore(), (ZkSolrResourceLoader) req.getCore().getResourceLoader()).run();
-                } catch (Exception e) {
-                  ParWork.propegateInterrupt(e);
-                  log.error("Unable to refresh conf ", e);
-                } finally {
-                  reloadLock.unlock();
+              //                if (!reloadLock.tryLock()) {
+              //                  log.info("Another reload is in progress . Not doing anything");
+              //                  return;
+              //                }
+              //  reloadLock.unlock();
+              Runnable runner = new Runnable() {
+                @Override
+                public void run() {
+                  //                if (!reloadLock.tryLock()) {
+                  //                  log.info("Another reload is in progress . Not doing anything");
+                  //                  return;
+                  //                }
+                  try {
+                    log.info("Trying to update my configs");
+                    SolrCore.getConfListener(req.getCore(),
+                        (ZkSolrResourceLoader) req.getCore()
+                            .getResourceLoader()).run();
+                  } catch (Exception e) {
+                    ParWork.propegateInterrupt(e);
+                    if (e instanceof InterruptedException) {
+                      return;
+                    }
+                    log.error("Unable to refresh conf ", e);
+                  } finally {
+                    //  reloadLock.unlock();
+                  }
                 }
-              }, SolrConfigHandler.class.getSimpleName() + "-refreshconf").start();
+              };
+              runner.run();
             } else {
               if (log.isInfoEnabled()) {
                 log.info("isStale {} , resourceloader {}", isStale, req.getCore().getResourceLoader().getClass().getName());
@@ -370,7 +382,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
       List<CommandOperation> ops = CommandOperation.readCommands(req.getContentStreams(), resp.getValues());
       if (ops == null) return;
       try {
-        for (; ; ) {
+        for (int i = 0;  i < 5; i++) {
           ArrayList<CommandOperation> opsCopy = new ArrayList<>(ops.size());
           for (CommandOperation op : ops) opsCopy.add(op.getCopy());
           try {
@@ -387,6 +399,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
             if (log.isInfoEnabled()) {
               log.info("Race condition, the node is modified in ZK by someone else {}", e.getMessage());
             }
+            Thread.sleep(250);
           }
         }
       } catch (Exception e) {
diff --git a/solr/core/src/test-files/solr/configsets/cloud-managed/conf/managed-schema b/solr/core/src/test-files/solr/configsets/cloud-managed/conf/managed-schema
index 14e5b94..44ac101 100644
--- a/solr/core/src/test-files/solr/configsets/cloud-managed/conf/managed-schema
+++ b/solr/core/src/test-files/solr/configsets/cloud-managed/conf/managed-schema
@@ -17,8 +17,8 @@
 -->
 <schema name="minimal" version="1.1">
   <fieldType name="string" class="solr.StrField"/>
-  <fieldType name="int" class="${solr.tests.IntegerFieldType}" docValues="${solr.tests.numeric.dv}" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
-  <fieldType name="long" class="${solr.tests.LongFieldType}" docValues="${solr.tests.numeric.dv}" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
+  <fieldType name="int" class="${solr.tests.IntegerFieldType}" docValues="${solr.tests.numeric.dv}" omitNorms="true" positionIncrementGap="0"/>
+  <fieldType name="long" class="${solr.tests.LongFieldType}" docValues="${solr.tests.numeric.dv}" omitNorms="true" positionIncrementGap="0"/>
   <!-- for versioning -->
   <field name="_version_" type="long" indexed="true" stored="true"/>
   <field name="_root_" type="string" indexed="true" stored="true" multiValued="false" required="false"/>
diff --git a/solr/core/src/test/org/apache/solr/handler/TestReqParamsAPI.java b/solr/core/src/test/org/apache/solr/handler/TestReqParamsAPI.java
index 5876ea9..da681a6 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestReqParamsAPI.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestReqParamsAPI.java
@@ -58,6 +58,12 @@ public class TestReqParamsAPI extends SolrCloudTestCase {
 
   @BeforeClass
   public static void createCluster() throws Exception {
+        System.setProperty("solr.tests.IntegerFieldType", "org.apache.solr.schema.IntPointField");
+          System.setProperty("solr.tests.FloatFieldType", "org.apache.solr.schema.FloatPointField");
+         System.setProperty("solr.tests.LongFieldType", "org.apache.solr.schema.LongPointField");
+         System.setProperty("solr.tests.DoubleFieldType", "org.apache.solr.schema.DoublePointField");
+         System.setProperty("solr.tests.DateFieldType", "org.apache.solr.schema.DatePointField");
+         System.setProperty("solr.tests.EnumFieldType", "org.apache.solr.schema.EnumFieldType");
     System.setProperty("managed.schema.mutable", "true");
     configureCluster(2)
         .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-managed").resolve("conf"))