You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2021/03/10 09:53:46 UTC

[lucene] branch jira/solr14977 created (now cf8d1f0)

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

dweiss pushed a change to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git.


      at cf8d1f0  Merge branch 'master' into jira/solr14977

This branch includes the following new commits:

     new b59e29d  SOLR-14977 :  ContainerPlugins should be configurable
     new df7840d  support super classes implementing COnfigurablePlugin<T>
     new 1e1a164  more tests
     new 196d610  cleanup
     new b7983a7  incorporating several review feedbacks. Added more tests. Changed the config object type
     new 71c52f6  configure() should use a method that implements MapWriter
     new 9481353  CHANGES.txt
     new cf8d1f0  Merge branch 'master' into jira/solr14977

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[lucene] 05/08: incorporating several review feedbacks. Added more tests. Changed the config object type

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit b7983a765c883014ad47d7a1735d7d337047846e
Author: noblepaul <no...@gmail.com>
AuthorDate: Wed Nov 11 10:58:27 2020 +1100

    incorporating several review feedbacks. Added more tests. Changed the config object type
---
 .../src/java/org/apache/solr/api/AnnotatedApi.java |  5 ++--
 .../org/apache/solr/api/ConfigurablePlugin.java    |  2 +-
 .../apache/solr/api/ContainerPluginsRegistry.java  | 23 +++++++++++++----
 .../src/java/org/apache/solr/api/V2HttpCall.java   |  2 +-
 .../solr/handler/admin/ContainerPluginsApi.java    | 12 +++++----
 .../apache/solr/handler/TestContainerPlugin.java   | 29 ++++++++++++++++++----
 6 files changed, 54 insertions(+), 19 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
index df373ea..9ec86ce 100644
--- a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
+++ b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
@@ -63,6 +63,8 @@ import org.slf4j.LoggerFactory;
 
 public class AnnotatedApi extends Api implements PermissionNameProvider , Closeable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  private static final ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper()
+          .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
   public static final String ERR = "Error executing commands :";
   private EndPoint endPoint;
@@ -223,8 +225,7 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
     final String command;
     final MethodHandle method;
     final Object obj;
-    ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper()
-        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
     int paramsCount;
     @SuppressWarnings({"rawtypes"})
     Class parameterClass;
diff --git a/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java b/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
index 969cc8d..e549bac 100644
--- a/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
+++ b/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
@@ -27,5 +27,5 @@ public interface ConfigurablePlugin<T> {
    * 
    * @param cfg value deserialized from JSON
    */
-  void initConfig(T cfg);
+  void configure(T cfg);
 }
diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index 883767a..62dab20 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -126,6 +126,20 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       this.original = original;
       meta = mapper.readValue(Utils.toJSON(original), PluginMeta.class);
     }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj instanceof PluginMetaHolder) {
+        PluginMetaHolder that = (PluginMetaHolder) obj;
+        return Objects.equals(this.original,that.original);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return original.hashCode();
+    }
   }
   @SuppressWarnings("unchecked")
   public synchronized void refresh() {
@@ -365,7 +379,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       }
     }
 
-    @SuppressWarnings({"rawtypes","unchecked"})
+    @SuppressWarnings({"rawtypes", "unchecked"})
     public void init() throws Exception {
       if (this.holders != null) return;
       Constructor constructor = klas.getConstructors()[0];
@@ -378,11 +392,10 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       }
       if (instance instanceof ConfigurablePlugin) {
         Class c = getConfigClass((ConfigurablePlugin<?>) instance);
-        if(c != null) {
-          Object initVal =  mapper.readValue(Utils.toJSON(holder.original), c);
-          ((ConfigurablePlugin) instance).initConfig(initVal);
+        if (c != null) {
+          Object initVal = mapper.readValue(Utils.toJSON(holder.original), c);
+          ((ConfigurablePlugin) instance).configure(initVal);
         }
-
       }
       if (instance instanceof ResourceLoaderAware) {
         try {
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index 5eae502..504db1f 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -136,7 +136,7 @@ public class V2HttpCall extends HttpSolrCall {
           initAdminRequest(path);
           return;
         } else {
-          throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "no core retrieved for " + origCorename);
+          throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "no core retrieved for core name:  " + origCorename + ". Path : "+ path);
         }
       }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java b/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java
index 4e3f7f5..57bcbef 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java
@@ -19,10 +19,7 @@ package org.apache.solr.handler.admin;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
@@ -122,7 +119,12 @@ public class ContainerPluginsApi {
           payload.addError("No such plugin: " + info.name);
           return null;
         } else {
-          map.put(info.name, info);
+          Map<String, Object> jsonObj = payload.getDataMap();
+          if(Objects.equals(jsonObj, existing)) {
+            //no need to change anything
+            return null;
+          }
+          map.put(info.name, jsonObj);
           return map;
         }
       });
diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index 7f9a927..01ab39f 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -44,6 +44,7 @@ import org.apache.solr.cloud.MiniSolrCloudCluster;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.NavigableObject;
 import org.apache.solr.common.annotation.JsonProperty;
+import org.apache.solr.common.util.ReflectMapWriter;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrResourceLoader;
@@ -212,8 +213,22 @@ public class TestContainerPlugin extends SolrCloudTestCase {
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of("/config/boolVal", "true", "/config/strVal", "Something","/config/longVal", "1234" ));
 
-
-      // kill the Overseer leader
+        p.strVal = "Something else";
+        new V2Request.Builder("/cluster/plugin")
+                .forceV2(true)
+                .POST()
+                .withPayload(singletonMap("update", p))
+                .build()
+                .process(cluster.getSolrClient());
+
+        TestDistribPackageStore.assertResponseValues(10,
+                () -> new V2Request.Builder("hello/plugin")
+                        .forceV2(true)
+                        .GET()
+                        .build().process(cluster.getSolrClient()),
+                ImmutableMap.of("/config/boolVal", "true", "/config/strVal", p.strVal,"/config/longVal", "1234" ));
+
+        // kill the Overseer leader
       for (JettySolrRunner jetty : cluster.getJettySolrRunners()) {
         if (!jetty.getCoreContainer().getZkController().getOverseer().isClosed()) {
           cluster.stopJettySolrRunner(jetty);
@@ -352,7 +367,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
 
     @Override
-    public void initConfig(CConfig cfg) {
+    public void configure(CConfig cfg) {
       this.cfg = cfg;
 
     }
@@ -366,7 +381,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
   }
 
-  public static class CConfig extends PluginMeta {
+  public static class CConfig implements ReflectMapWriter {
 
     @JsonProperty
     public String strVal;
@@ -377,6 +392,11 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     @JsonProperty
     public Boolean boolVal;
 
+    @JsonProperty
+    public String name;
+
+    @JsonProperty(value = "class", required = true)
+    public String klass;
   }
 
   public static class C6 implements ClusterSingleton {
@@ -423,7 +443,6 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     private  SolrResourceLoader resourceLoader;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void inform(ResourceLoader loader) throws IOException {
       this.resourceLoader = (SolrResourceLoader) loader;
       try {


[lucene] 08/08: Merge branch 'master' into jira/solr14977

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit cf8d1f01e8247a755762582f1905686553039493
Merge: 9481353 ebc87a8
Author: Noble Paul <no...@users.noreply.github.com>
AuthorDate: Mon Nov 16 23:41:44 2020 +1100

    Merge branch 'master' into jira/solr14977

 .github/workflows/docker-test.yml                  |    4 +
 build.gradle                                       |    3 +
 gradle/documentation/render-javadoc.gradle         |   28 +-
 gradle/generation/snowball.gradle                  |    6 +-
 gradle/generation/snowball.patch                   |   10 +-
 gradle/help.gradle                                 |    1 +
 gradle/native/disable-native.gradle                |   82 ++
 gradle/testing/randomization/policies/tests.policy |    4 +
 help/docker.txt                                    |   58 +
 lucene/CHANGES.txt                                 |   26 +-
 lucene/MIGRATE.md                                  |   12 +
 .../lucene/analysis/classic/package-info.java}     |   17 +-
 .../apache/lucene/analysis/classic/package.html    |   37 -
 .../apache/lucene/analysis/email/package-info.java |   34 +
 .../org/apache/lucene/analysis/email/package.html  |   39 -
 .../org/tartarus/snowball/ext/SerbianStemmer.java  |  235 ++--
 .../org/tartarus/snowball/ext/YiddishStemmer.java  | 1381 ++++++++++++++++++++
 .../apache/lucene/analysis/snowball/languages.txt  |    1 +
 .../backward_codecs/lucene50/package-info.java}    |   10 +-
 .../lucene/backward_codecs/lucene50/package.html   |   25 -
 .../backward_codecs/lucene60/package-info.java}    |   10 +-
 .../backward_codecs/lucene80/package-info.java}    |   10 +-
 .../lucene/backward_codecs/lucene80/package.html   |   25 -
 .../backward_codecs/lucene84/package-info.java}    |   10 +-
 .../lucene/backward_codecs/lucene84/package.html   |   25 -
 .../backward_codecs/lucene86/package-info.java}    |   10 +-
 .../lucene/backward_codecs/lucene86/package.html   |   25 -
 .../backward_codecs/lucene87/Lucene87Codec.java    |   33 +-
 .../backward_codecs/lucene87/package-info.java}    |   10 +-
 .../lucene/backward_codecs/lucene87/package.html   |   42 -
 .../lucene/backward_codecs/package-info.java}      |   10 +-
 .../org/apache/lucene/backward_codecs/package.html |   26 -
 .../lucene50/Lucene50RWStoredFieldsFormat.java     |    1 -
 .../backward_codecs/lucene50/TestForUtil.java      |    1 -
 .../lucene60/Lucene60PointsWriter.java             |    2 -
 .../lucene70/Lucene70RWSegmentInfoFormat.java      |    1 -
 .../simpletext/SimpleTextTermVectorsWriter.java    |    2 +-
 .../codecs/simpletext/SimpleTextVectorFormat.java  |    4 +-
 .../codecs/simpletext/SimpleTextVectorReader.java  |   14 +-
 .../org/apache/lucene/codecs/VectorWriter.java     |   27 +-
 .../codecs/lucene80/Lucene80DocValuesConsumer.java |   80 +-
 .../codecs/lucene80/Lucene80DocValuesFormat.java   |   24 +-
 .../codecs/lucene80/Lucene80DocValuesProducer.java |   36 +-
 .../lucene/codecs/lucene90/Lucene90Codec.java      |   27 +-
 .../codecs/lucene90/Lucene90VectorFormat.java      |    6 +-
 .../codecs/lucene90/Lucene90VectorReader.java      |  217 ++-
 .../codecs/lucene90/Lucene90VectorWriter.java      |   92 +-
 .../org/apache/lucene/document/FeatureField.java   |   68 +-
 .../apache/lucene/document/InetAddressPoint.java   |    0
 .../apache/lucene/document/InetAddressRange.java   |    0
 .../apache/lucene/index/IndexableFieldType.java    |   30 +-
 .../org/apache/lucene/index/IndexingChain.java     |   20 +-
 .../org/apache/lucene/index/KnnGraphValues.java    |   58 +
 .../java/org/apache/lucene/index/OrdinalMap.java   |    4 +-
 .../java/org/apache/lucene/index/PointValues.java  |    3 +-
 .../lucene/index/RandomAccessVectorValues.java     |   60 +
 .../index/RandomAccessVectorValuesProducer.java}   |   16 +-
 .../org/apache/lucene/index/SegmentMerger.java     |    5 +-
 .../lucene/index/SlowCodecReaderWrapper.java       |    2 +-
 .../java/org/apache/lucene/index/VectorValues.java |  114 +-
 .../apache/lucene/index/VectorValuesWriter.java    |   43 +-
 .../org/apache/lucene/util/hnsw/BoundsChecker.java |   74 ++
 .../org/apache/lucene/util/hnsw/HnswGraph.java     |  223 ++++
 .../apache/lucene/util/hnsw/HnswGraphBuilder.java  |  194 +++
 .../java/org/apache/lucene/util/hnsw/Neighbor.java |   70 +
 .../org/apache/lucene/util/hnsw/Neighbors.java     |   93 ++
 .../org/apache/lucene/util/hnsw/package-info.java} |   10 +-
 ...va => BaseLucene80DocValuesFormatTestCase.java} |   12 +-
 ...estBestCompressionLucene80DocValuesFormat.java} |   17 +-
 .../TestBestSpeedLucene80DocValuesFormat.java}     |   17 +-
 ...tLucene87StoredFieldsFormatHighCompression.java |    2 +-
 .../apache/lucene/document/TestFeatureField.java   |   25 +
 .../lucene/document/TestInetAddressPoint.java      |    0
 .../test/org/apache/lucene/index/TestKnnGraph.java |  382 ++++++
 .../org/apache/lucene/index/TestVectorValues.java  |   47 +-
 .../lucene/search/TestInetAddressRangeQueries.java |    0
 .../apache/lucene/util/hnsw/KnnGraphTester.java    |  494 +++++++
 .../test/org/apache/lucene/util/hnsw/TestHnsw.java |  465 +++++++
 lucene/facet/build.gradle                          |    2 +
 .../directory/DirectoryTaxonomyReader.java         |   24 +-
 .../directory/DirectoryTaxonomyWriter.java         |    7 +-
 .../directory/TestBackwardsCompatibility.java      |  110 ++
 .../taxonomy/directory/taxonomy.8.6.3-cfs.zip      |  Bin 0 -> 3058 bytes
 .../join/GlobalOrdinalsWithScoreCollector.java     |    2 +-
 .../search/join/GlobalOrdinalsWithScoreQuery.java  |    2 +-
 .../org/apache/lucene/search/join/JoinUtil.java    |    2 +-
 .../apache/lucene/search/join/TestJoinUtil.java    |   16 +-
 .../jetty-continuation-9.4.32.v20200930.jar.sha1   |    1 -
 .../jetty-continuation-9.4.34.v20201102.jar.sha1   |    1 +
 .../licenses/jetty-http-9.4.32.v20200930.jar.sha1  |    1 -
 .../licenses/jetty-http-9.4.34.v20201102.jar.sha1  |    1 +
 lucene/licenses/jetty-io-9.4.32.v20200930.jar.sha1 |    1 -
 lucene/licenses/jetty-io-9.4.34.v20201102.jar.sha1 |    1 +
 .../jetty-server-9.4.32.v20200930.jar.sha1         |    1 -
 .../jetty-server-9.4.34.v20201102.jar.sha1         |    1 +
 .../jetty-servlet-9.4.32.v20200930.jar.sha1        |    1 -
 .../jetty-servlet-9.4.34.v20201102.jar.sha1        |    1 +
 .../licenses/jetty-util-9.4.32.v20200930.jar.sha1  |    1 -
 .../licenses/jetty-util-9.4.34.v20201102.jar.sha1  |    1 +
 lucene/misc/build.gradle                           |    4 +-
 lucene/misc/native/build.gradle                    |   69 +
 .../src/main/posix}/NativePosixUtil.cpp            |   20 +-
 .../src/main/windows}/WindowsDirectory.cpp         |   16 +-
 .../java/org/apache/lucene/document/package.html   |   22 -
 .../src/java/org/apache/lucene/index/package.html  |   22 -
 .../apache/lucene/misc/CollectorMemoryTracker.java |    2 +-
 .../org/apache/lucene/misc/IndexMergeTool.java     |    2 +-
 .../lucene/{ => misc}/document/LazyDocument.java   |    3 +-
 .../apache/lucene/misc/document/package-info.java} |   10 +-
 .../lucene/{ => misc}/index/IndexSplitter.java     |   17 +-
 .../{ => misc}/index/MultiPassIndexSplitter.java   |   18 +-
 .../lucene/{ => misc}/index/PKIndexSplitter.java   |    9 +-
 .../apache/lucene/misc/index/package-info.java}    |   10 +-
 .../search/DiversifiedTopDocsCollector.java        |   11 +-
 .../lucene/{ => misc}/search/DocValuesStats.java   |    2 +-
 .../{ => misc}/search/DocValuesStatsCollector.java |    6 +-
 .../search/MemoryAccountingBitsetCollector.java    |    4 +-
 .../apache/lucene/misc/search/package-info.java}   |   10 +-
 .../search/similarity/LegacyBM25Similarity.java    |    2 +-
 .../misc/search/similarity/package-info.java}      |   10 +-
 .../store/HardlinkCopyDirectoryWrapper.java        |    7 +-
 .../lucene/{ => misc}/store/NativePosixUtil.java   |    4 +-
 .../{ => misc}/store/NativeUnixDirectory.java      |   18 +-
 .../lucene/{ => misc}/store/RAFDirectory.java      |   12 +-
 .../lucene/{ => misc}/store/WindowsDirectory.java  |   24 +-
 .../apache/lucene/misc/store/package-info.java}    |   10 +-
 .../lucene/{ => misc}/util/MemoryTracker.java      |    2 +-
 .../lucene/{ => misc}/util/fst/ListOfOutputs.java  |    4 +-
 .../util/fst/UpToTwoPositiveIntOutputs.java        |    4 +-
 .../apache/lucene/misc/util/fst/package-info.java} |   10 +-
 .../org/apache/lucene/misc/util/package-info.java} |   11 +-
 .../src/java/org/apache/lucene/search/package.html |   22 -
 .../apache/lucene/search/similarity/package.html   |   22 -
 .../src/java/org/apache/lucene/store/package.html  |   22 -
 .../java/org/apache/lucene/util/fst/package.html   |   22 -
 .../src/java/org/apache/lucene/util/package.html   |   23 -
 lucene/misc/src/java/overview.html                 |   25 +-
 .../{ => misc}/document/TestLazyDocument.java      |    6 +-
 .../lucene/{ => misc}/index/TestIndexSplitter.java |   11 +-
 .../index/TestMultiPassIndexSplitter.java          |    9 +-
 .../{ => misc}/index/TestPKIndexSplitter.java      |    8 +-
 .../search/TestDiversifiedTopDocsCollector.java    |   16 +-
 .../search/TestDocValuesStatsCollector.java        |   18 +-
 .../TestMemoryAccountingBitsetCollector.java       |    6 +-
 .../similarity/TestLegacyBM25Similarity.java       |    2 +-
 .../lucene/misc/store/NativeLibEnableRule.java     |   54 +
 .../lucene/misc/store/NativeUnixDirectoryTest.java |   46 +
 .../store/TestHardLinkCopyDirectoryWrapper.java    |   12 +-
 .../lucene/{ => misc}/store/TestRAFDirectory.java  |    5 +-
 .../store/WindowsDirectoryTest.java}               |   30 +-
 .../util/TestCollectorMemoryTracker.java           |    3 +-
 .../lucene/{ => misc}/util/fst/TestFSTsMisc.java   |   16 +-
 lucene/packaging/build.gradle                      |    4 +-
 .../lucene/queries/intervals/IntervalQuery.java    |    2 +-
 .../lucene/sandbox/document/package-info.java}     |   13 +-
 .../apache/lucene/sandbox/document/package.html    |   32 -
 .../lucene/sandbox/search/package-info.java}       |   10 +-
 .../org/apache/lucene/sandbox/search/package.html  |   28 -
 .../java/org/apache/lucene/index/DocHelper.java    |    3 +-
 .../java/org/apache/lucene/index/RandomCodec.java  |    3 +-
 .../util/TestRuleSetupAndRestoreClassEnv.java      |    3 +-
 .../java/org/apache/lucene/util/fst/FSTTester.java |    8 +-
 .../org/apache/lucene/util/TestPleaseFail.java}    |   20 +-
 settings.gradle                                    |    3 +-
 .../src/java/org/apache/solr/cloud/CloudUtil.java  |   15 +-
 .../org/apache/solr/cloud/ReplicateFromLeader.java |    3 +-
 .../solr/cloud/ShardLeaderElectionContext.java     |    2 +-
 .../events/impl/DefaultClusterEventProducer.java   |    2 +-
 .../java/org/apache/solr/core/CoreContainer.java   |   43 +-
 .../java/org/apache/solr/core/MetricsConfig.java   |   54 +-
 .../org/apache/solr/core/SchemaCodecFactory.java   |    6 +-
 .../src/java/org/apache/solr/core/SolrCore.java    |   12 +-
 .../src/java/org/apache/solr/core/SolrCores.java   |  226 ++--
 .../java/org/apache/solr/core/SolrXmlConfig.java   |   24 +
 .../apache/solr/core/TransientSolrCoreCache.java   |    4 +
 .../solr/core/TransientSolrCoreCacheDefault.java   |   16 +-
 .../solr/core/TransientSolrCoreCacheFactory.java   |   16 +-
 .../src/java/org/apache/solr/core/ZkContainer.java |   13 +-
 .../apache/solr/handler/ReplicationHandler.java    |    8 +-
 .../solr/handler/admin/HealthCheckHandler.java     |    2 +-
 .../org/apache/solr/handler/admin/StatusOp.java    |    5 +-
 .../handler/component/RealTimeGetComponent.java    |    2 +-
 .../org/apache/solr/metrics/SolrMetricManager.java |   29 +
 .../apache/solr/metrics/SolrMetricsContext.java    |   28 +
 .../apache/solr/search/SolrDocumentFetcher.java    |    2 +-
 .../org/apache/solr/search/SolrIndexSearcher.java  |   18 +-
 .../similarities/LegacyBM25SimilarityFactory.java  |    2 +-
 .../similarities/SchemaSimilarityFactory.java      |    2 +-
 .../org/apache/solr/update/SolrIndexSplitter.java  |    2 +-
 .../processor/AtomicUpdateDocumentMerger.java      |  121 +-
 .../src/test-files/solr/solr-metricsconfig1.xml    |   21 +-
 .../org/apache/solr/BasicFunctionalityTest.java    |    2 +-
 .../org/apache/solr/core/TestCodecSupport.java     |    2 +-
 .../org/apache/solr/core/TestCoreContainer.java    |    3 +
 .../test/org/apache/solr/core/TestLazyCores.java   |   10 +-
 .../org/apache/solr/metrics/MetricsConfigTest.java |   26 +-
 .../solr/metrics/SolrMetricsIntegrationTest.java   |    5 +
 .../org/apache/solr/search/LargeFieldTest.java     |    2 +-
 .../apache/solr/search/SolrIndexSearcherTest.java  |  123 ++
 .../TestLegacyBM25SimilarityFactory.java           |    2 +-
 .../update/processor/AtomicUpdateJavabinTest.java  |  370 ++++++
 .../processor/AtomicUpdateRemovalJavabinTest.java  |  132 --
 .../solr/update/processor/AtomicUpdatesTest.java   |   32 +
 solr/docker/build.gradle                           |   27 +-
 solr/docker/tests/cases/version/test.sh            |   45 -
 .../http2-client-9.4.32.v20200930.jar.sha1         |    1 -
 .../http2-client-9.4.34.v20201102.jar.sha1         |    1 +
 .../http2-common-9.4.32.v20200930.jar.sha1         |    1 -
 .../http2-common-9.4.34.v20201102.jar.sha1         |    1 +
 .../licenses/http2-hpack-9.4.32.v20200930.jar.sha1 |    1 -
 .../licenses/http2-hpack-9.4.34.v20201102.jar.sha1 |    1 +
 ...http-client-transport-9.4.32.v20200930.jar.sha1 |    1 -
 ...http-client-transport-9.4.34.v20201102.jar.sha1 |    1 +
 .../http2-server-9.4.32.v20200930.jar.sha1         |    1 -
 .../http2-server-9.4.34.v20201102.jar.sha1         |    1 +
 .../jetty-alpn-client-9.4.32.v20200930.jar.sha1    |    1 -
 .../jetty-alpn-client-9.4.34.v20201102.jar.sha1    |    1 +
 ...etty-alpn-java-client-9.4.32.v20200930.jar.sha1 |    1 -
 ...etty-alpn-java-client-9.4.34.v20201102.jar.sha1 |    1 +
 ...etty-alpn-java-server-9.4.32.v20200930.jar.sha1 |    1 -
 ...etty-alpn-java-server-9.4.34.v20201102.jar.sha1 |    1 +
 .../jetty-alpn-server-9.4.32.v20200930.jar.sha1    |    1 -
 .../jetty-alpn-server-9.4.34.v20201102.jar.sha1    |    1 +
 .../jetty-client-9.4.32.v20200930.jar.sha1         |    1 -
 .../jetty-client-9.4.34.v20201102.jar.sha1         |    1 +
 .../jetty-continuation-9.4.32.v20200930.jar.sha1   |    1 -
 .../jetty-continuation-9.4.34.v20201102.jar.sha1   |    1 +
 .../jetty-deploy-9.4.32.v20200930.jar.sha1         |    1 -
 .../jetty-deploy-9.4.34.v20201102.jar.sha1         |    1 +
 solr/licenses/jetty-http-9.4.32.v20200930.jar.sha1 |    1 -
 solr/licenses/jetty-http-9.4.34.v20201102.jar.sha1 |    1 +
 solr/licenses/jetty-io-9.4.32.v20200930.jar.sha1   |    1 -
 solr/licenses/jetty-io-9.4.34.v20201102.jar.sha1   |    1 +
 solr/licenses/jetty-jmx-9.4.32.v20200930.jar.sha1  |    1 -
 solr/licenses/jetty-jmx-9.4.34.v20201102.jar.sha1  |    1 +
 .../jetty-rewrite-9.4.32.v20200930.jar.sha1        |    1 -
 .../jetty-rewrite-9.4.34.v20201102.jar.sha1        |    1 +
 .../jetty-security-9.4.32.v20200930.jar.sha1       |    1 -
 .../jetty-security-9.4.34.v20201102.jar.sha1       |    1 +
 .../jetty-server-9.4.32.v20200930.jar.sha1         |    1 -
 .../jetty-server-9.4.34.v20201102.jar.sha1         |    1 +
 .../jetty-servlet-9.4.32.v20200930.jar.sha1        |    1 -
 .../jetty-servlet-9.4.34.v20201102.jar.sha1        |    1 +
 .../jetty-servlets-9.4.32.v20200930.jar.sha1       |    1 -
 .../jetty-servlets-9.4.34.v20201102.jar.sha1       |    1 +
 .../jetty-start-9.4.27.v20200227-shaded.jar.sha1   |    1 -
 .../jetty-start-9.4.34.v20201102-shaded.jar.sha1   |    1 +
 solr/licenses/jetty-util-9.4.32.v20200930.jar.sha1 |    1 -
 solr/licenses/jetty-util-9.4.34.v20201102.jar.sha1 |    1 +
 .../jetty-webapp-9.4.32.v20200930.jar.sha1         |    1 -
 .../jetty-webapp-9.4.34.v20201102.jar.sha1         |    1 +
 solr/licenses/jetty-xml-9.4.32.v20200930.jar.sha1  |    1 -
 solr/licenses/jetty-xml-9.4.34.v20201102.jar.sha1  |    1 +
 solr/solr-ref-guide/src/collection-management.adoc |    5 +
 solr/solr-ref-guide/src/metrics-reporting.adoc     |   39 +
 solr/solr-ref-guide/src/replica-management.adoc    |    5 +
 .../solr/client/solrj/request/TestCoreAdmin.java   |    1 +
 .../solr/common/cloud/TestZkMaintenanceUtils.java  |    2 -
 versions.lock                                      |   48 +-
 versions.props                                     |    4 +-
 260 files changed, 6354 insertions(+), 1647 deletions(-)


[lucene] 06/08: configure() should use a method that implements MapWriter

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 71c52f68d1a4e7dbce8eb6a758cba36c173a524f
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Nov 16 23:37:21 2020 +1100

    configure() should use a method that implements MapWriter
---
 solr/CHANGES.txt                                            | 13 ++++++++++++-
 .../src/java/org/apache/solr/api/ConfigurablePlugin.java    |  4 +++-
 .../java/org/apache/solr/api/ContainerPluginsRegistry.java  |  4 ++--
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 0dd9f18..28c9ab4 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -151,6 +151,8 @@ Other Changes
 
 * SOLR-14978: Enable OOM Killer Script in Solr Foreground. Simplify getting heap dumps on OOM. (Mike Drob, Houston Putman)
 
+* SOLR-14949: Ability to customize docker image name/base image (Houston Putman)
+
 Bug Fixes
 ---------------------
 * SOLR-14546: Fix for a relatively hard to hit issue in OverseerTaskProcessor that could lead to out of order execution
@@ -172,9 +174,11 @@ Improvements
 
 * SOLR-14955: Add env var options for the Prometheus Exporter bin scripts (Houston Putman)
 
+* SOLR-14683: Metrics API should ensure consistent placeholders for missing values. (ab)
+
 Optimizations
 ---------------------
-(No changes)
+* SOLR-14975: Optimize CoreContainer.getAllCoreNames, getLoadedCoreNames and getCoreDescriptors. (Bruno Roustant)
 
 Bug Fixes
 ---------------------
@@ -188,11 +192,18 @@ Bug Fixes
 
 * SOLR-14961: Fix for deleting zookeeper nodes with same path length. Only the first zk-node was removed. (Michael Aleythe via Mike Drob)
 
+* SOLR-14971: AtomicUpdate 'remove', 'add-distinct' operations now works on numeric, date fields in uncommitted docs (Jason Gerlowski)
+
+* SOLR-14983: Fix response returning original score instead of reranked score due to query and filter combining.
+  (Krishan Goyal, Jason Baik, Christine Poerschke)
+
 Other Changes
 ---------------------
 
 * SOLR-14954: Heavily edit reindexing.adoc (Sameul García Martínez and Erick Erickson)
 
+* SOLR-14995: Update Jetty to 9.4.34 (Mike Drob)
+
 ==================  8.7.0 ==================
 
 Consult the lucene/CHANGES.txt file for additional, low level, changes in this release.
diff --git a/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java b/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
index e549bac..ef13d8a 100644
--- a/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
+++ b/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
@@ -17,11 +17,13 @@
 
 package org.apache.solr.api;
 
+import org.apache.solr.common.MapWriter;
+
 /**Implement this interface if your plugin needs to accept some configuration
  * 
  * @param <T> the configuration Object type
  */
-public interface ConfigurablePlugin<T> {
+public interface ConfigurablePlugin<T extends MapWriter> {
 
   /**This is invoked soon after the Object is initialized
    * 
diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index 62dab20..158bcf6 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -391,9 +391,9 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
         throw new RuntimeException("Must have a no-arg constructor or CoreContainer constructor ");
       }
       if (instance instanceof ConfigurablePlugin) {
-        Class c = getConfigClass((ConfigurablePlugin<?>) instance);
+        Class<? extends MapWriter> c = getConfigClass((ConfigurablePlugin<? extends MapWriter>) instance);
         if (c != null) {
-          Object initVal = mapper.readValue(Utils.toJSON(holder.original), c);
+          MapWriter initVal = mapper.readValue(Utils.toJSON(holder.original), c);
           ((ConfigurablePlugin) instance).configure(initVal);
         }
       }


[lucene] 02/08: support super classes implementing COnfigurablePlugin

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit df7840dee5894dd819fbd552f1cbe002729e6dd5
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Nov 9 09:35:41 2020 +1100

    support super classes implementing COnfigurablePlugin<T>
---
 .../apache/solr/api/ContainerPluginsRegistry.java   | 21 ++++++++++++++-------
 .../apache/solr/handler/TestContainerPlugin.java    | 10 ++++++++++
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index 690aee8..883767a 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -377,7 +377,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
         throw new RuntimeException("Must have a no-arg constructor or CoreContainer constructor ");
       }
       if (instance instanceof ConfigurablePlugin) {
-        Class c = getConfigObj(instance);
+        Class c = getConfigClass((ConfigurablePlugin<?>) instance);
         if(c != null) {
           Object initVal =  mapper.readValue(Utils.toJSON(holder.original), c);
           ((ConfigurablePlugin) instance).initConfig(initVal);
@@ -397,19 +397,26 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       }
     }
 
-    @SuppressWarnings("rawtypes")
-    private Class getConfigObj(Object o) {
-      Type[] interfaces = o.getClass().getGenericInterfaces();
+  }
+
+  /**Get the generic type of a {@link ConfigurablePlugin}
+   */
+  @SuppressWarnings("rawtypes")
+  public static Class getConfigClass(ConfigurablePlugin<?> o) {
+    Class klas = o.getClass();
+    do {
+      Type[] interfaces = klas.getGenericInterfaces();
       for (Type type : interfaces) {
         if (type instanceof ParameterizedType) {
           ParameterizedType parameterizedType = (ParameterizedType) type;
-          if(parameterizedType.getRawType() == ConfigurablePlugin.class) {
+          if (parameterizedType.getRawType() == ConfigurablePlugin.class) {
             return (Class) parameterizedType.getActualTypeArguments()[0];
           }
         }
       }
-      return null;
-    }
+      klas = klas.getSuperclass();
+    } while (klas != null && klas != Object.class);
+    return null;
   }
 
   public ApiInfo createInfo(Map<String,Object> info, List<String> errs) throws IOException {
diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index 79e3458..f3dea90 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -29,6 +29,7 @@ import org.apache.lucene.util.ResourceLoader;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.ConfigurablePlugin;
+import org.apache.solr.api.ContainerPluginsRegistry;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -188,6 +189,9 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       assertTrue("startCalled", C6.startCalled);
       assertFalse("stopCalled", C6.stopCalled);
 
+      assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC()));
+      assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC1()));
+
       CConfig p = new CConfig();
       p.boolVal = Boolean.TRUE;
       p.strVal = "Something";
@@ -336,6 +340,12 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     }
   }
 
+  public static class CC1 extends CC {
+
+  }
+  public static class CC2 extends CC1 {
+
+  }
   public static class CC implements ConfigurablePlugin<CConfig> {
     private CConfig cfg;
 


[lucene] 03/08: more tests

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 1e1a164dad555c726c9d1b09ff553b186ce5e12d
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Nov 9 10:58:48 2020 +1100

    more tests
---
 solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java | 1 +
 1 file changed, 1 insertion(+)

diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index f3dea90..5bf3375 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -191,6 +191,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
       assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC()));
       assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC1()));
+      assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC2()));
 
       CConfig p = new CConfig();
       p.boolVal = Boolean.TRUE;


[lucene] 07/08: CHANGES.txt

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 9481353bb6ab65cabdc311553d1d5cdae21f5816
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Nov 16 23:40:29 2020 +1100

    CHANGES.txt
---
 solr/CHANGES.txt | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 28c9ab4..53aff7c 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -176,6 +176,8 @@ Improvements
 
 * SOLR-14683: Metrics API should ensure consistent placeholders for missing values. (ab)
 
+* SOLR-14977 : ContainerPlugins should be configurable with custom objects (noble, ab)
+
 Optimizations
 ---------------------
 * SOLR-14975: Optimize CoreContainer.getAllCoreNames, getLoadedCoreNames and getCoreDescriptors. (Bruno Roustant)


[lucene] 04/08: cleanup

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 196d610783315930963558963eedfdc1ca1df252
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Nov 9 11:44:34 2020 +1100

    cleanup
---
 .../apache/solr/handler/TestContainerPlugin.java   | 37 +++++++++++-----------
 .../solr/client/solrj/request/V2Request.java       | 20 ++++++++++++
 2 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index 5bf3375..7f9a927 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -61,7 +61,6 @@ import org.junit.Test;
 import static java.util.Collections.singletonList;
 import static java.util.Collections.singletonMap;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
-import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
 import static org.apache.solr.filestore.TestDistribPackageStore.readFile;
 import static org.apache.solr.filestore.TestDistribPackageStore.uploadKey;
 
@@ -91,7 +90,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       //test with an invalid class
       V2Request req = new V2Request.Builder("/cluster/plugin")
           .forceV2(true)
-          .withMethod(POST)
+          .POST()
           .withPayload(singletonMap("add", plugin))
           .build();
       expectError(req, cluster.getSolrClient(), errPath, "No method with @Command in class");
@@ -103,7 +102,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       //just check if the plugin is indeed registered
       V2Request readPluginState = new V2Request.Builder("/cluster/plugin")
           .forceV2(true)
-          .withMethod(GET)
+          .GET()
           .build();
       V2Response rsp = readPluginState.process(cluster.getSolrClient());
       assertEquals(C3.class.getName(), rsp._getStr("/plugin/testplugin/class", null));
@@ -112,13 +111,13 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       TestDistribPackageStore.assertResponseValues(10,
           () -> new V2Request.Builder("/plugin/my/plugin")
               .forceV2(true)
-              .withMethod(GET)
+              .GET()
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of("/testkey", "testval"));
 
       //now remove the plugin
       new V2Request.Builder("/cluster/plugin")
-          .withMethod(POST)
+          .POST()
           .forceV2(true)
           .withPayload("{remove : testplugin}")
           .build()
@@ -143,19 +142,19 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       TestDistribPackageStore.assertResponseValues(10,
           () -> new V2Request.Builder("/my-random-name/my/plugin")
               .forceV2(true)
-              .withMethod(GET)
+              .GET()
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of("/method.name", "m1"));
 
   TestDistribPackageStore.assertResponseValues(10,
           () -> new V2Request.Builder("/my-random-prefix/their/plugin")
               .forceV2(true)
-              .withMethod(GET)
+              .GET()
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of("/method.name", "m2"));
       //now remove the plugin
       new V2Request.Builder("/cluster/plugin")
-          .withMethod(POST)
+          .POST()
           .forceV2(true)
           .withPayload("{remove : my-random-name}")
           .build()
@@ -163,12 +162,12 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
       expectFail( () -> new V2Request.Builder("/my-random-prefix/their/plugin")
           .forceV2(true)
-          .withMethod(GET)
+          .GET()
           .build()
           .process(cluster.getSolrClient()));
       expectFail(() -> new V2Request.Builder("/my-random-prefix/their/plugin")
           .forceV2(true)
-          .withMethod(GET)
+          .GET()
           .build()
           .process(cluster.getSolrClient()));
 
@@ -180,7 +179,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       //just check if the plugin is indeed registered
       readPluginState = new V2Request.Builder("/cluster/plugin")
           .forceV2(true)
-          .withMethod(GET)
+          .GET()
           .build();
       rsp = readPluginState.process(cluster.getSolrClient());
       assertEquals(C6.class.getName(), rsp._getStr("/plugin/clusterSingleton/class", null));
@@ -202,14 +201,14 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
       new V2Request.Builder("/cluster/plugin")
           .forceV2(true)
-          .withMethod(POST)
+          .POST()
           .withPayload(singletonMap("add", p))
           .build()
           .process(cluster.getSolrClient());
       TestDistribPackageStore.assertResponseValues(10,
           () -> new V2Request.Builder("hello/plugin")
               .forceV2(true)
-              .withMethod(GET)
+              .GET()
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of("/config/boolVal", "true", "/config/strVal", "Something","/config/longVal", "1234" ));
 
@@ -263,7 +262,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       add.files = singletonList(FILE1);
       V2Request addPkgVersionReq = new V2Request.Builder("/cluster/package")
           .forceV2(true)
-          .withMethod(POST)
+          .POST()
           .withPayload(singletonMap("add", add))
           .build();
       addPkgVersionReq.process(cluster.getSolrClient());
@@ -280,14 +279,14 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       plugin.version = add.version;
       final V2Request req1 = new V2Request.Builder("/cluster/plugin")
           .forceV2(true)
-          .withMethod(POST)
+          .POST()
           .withPayload(singletonMap("add", plugin))
           .build();
       req1.process(cluster.getSolrClient());
       //verify the plugin creation
       TestDistribPackageStore.assertResponseValues(10,
           () -> new V2Request.Builder("/cluster/plugin").
-              withMethod(GET)
+              GET()
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of(
               "/plugin/myplugin/class", plugin.klass,
@@ -296,7 +295,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       //let's test this now
       Callable<NavigableObject> invokePlugin = () -> new V2Request.Builder("/plugin/my/path")
           .forceV2(true)
-          .withMethod(GET)
+          .GET()
           .build().process(cluster.getSolrClient());
       TestDistribPackageStore.assertResponseValues(10,
           invokePlugin,
@@ -311,7 +310,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       plugin.version = add.version;
       new V2Request.Builder("/cluster/plugin")
           .forceV2(true)
-          .withMethod(POST)
+          .POST()
           .withPayload(singletonMap("update", plugin))
           .build()
       .process(cluster.getSolrClient());
@@ -319,7 +318,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       //now verify if it is indeed updated
       TestDistribPackageStore.assertResponseValues(10,
           () -> new V2Request.Builder("/cluster/plugin").
-              withMethod(GET)
+              GET()
               .build().process(cluster.getSolrClient()),
           ImmutableMap.of(
               "/plugin/myplugin/class", plugin.klass,
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java
index 932eb6b..fda9ed3 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java
@@ -165,6 +165,26 @@ public class V2Request extends SolrRequest<V2Response> implements MapWriter {
       return this;
     }
 
+    public Builder POST() {
+      this.method = METHOD.POST;
+      return this;
+    }
+
+    public Builder GET() {
+      this.method = METHOD.GET;
+      return this;
+    }
+
+    public Builder PUT() {
+      this.method = METHOD.PUT;
+      return this;
+    }
+
+    public Builder DELETE() {
+      this.method = METHOD.DELETE;
+      return this;
+    }
+
     /**
      * Only for testing. It's always true otherwise
      */


[lucene] 01/08: SOLR-14977 : ContainerPlugins should be configurable

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit b59e29d90f585b8a8f2ee8d3dfd2a36ca968d075
Author: Noble Paul <no...@gmail.com>
AuthorDate: Fri Nov 6 15:16:47 2020 +1100

    SOLR-14977 :  ContainerPlugins should be configurable
---
 .../src/java/org/apache/solr/api/AnnotatedApi.java |  4 +-
 .../org/apache/solr/api/ConfigurablePlugin.java    | 31 ++++++++++
 .../apache/solr/api/ContainerPluginsRegistry.java  | 68 +++++++++++++++++-----
 .../solr/handler/admin/ContainerPluginsApi.java    |  6 +-
 .../apache/solr/handler/TestContainerPlugin.java   | 57 ++++++++++++++++++
 .../apache/solr/common/util/JsonSchemaCreator.java |  1 +
 6 files changed, 150 insertions(+), 17 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
index f9f97a4..df373ea 100644
--- a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
+++ b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
@@ -33,6 +33,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.common.SolrException;
@@ -222,7 +223,8 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
     final String command;
     final MethodHandle method;
     final Object obj;
-    ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper();
+    ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper()
+        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     int paramsCount;
     @SuppressWarnings({"rawtypes"})
     Class parameterClass;
diff --git a/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java b/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
new file mode 100644
index 0000000..969cc8d
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/api/ConfigurablePlugin.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.api;
+
+/**Implement this interface if your plugin needs to accept some configuration
+ * 
+ * @param <T> the configuration Object type
+ */
+public interface ConfigurablePlugin<T> {
+
+  /**This is invoked soon after the Object is initialized
+   * 
+   * @param cfg value deserialized from JSON
+   */
+  void initConfig(T cfg);
+}
diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index 8d0267c..690aee8 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -22,6 +22,8 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -31,6 +33,7 @@ import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Supplier;
 
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -69,7 +72,8 @@ import static org.apache.solr.common.util.Utils.makeMap;
 public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapWriter, Closeable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private final ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper();
+  private static final ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper()
+      .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
   private final List<PluginRegistryListener> listeners = new CopyOnWriteArrayList<>();
 
@@ -114,6 +118,16 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
     return currentPlugins.get(name);
   }
 
+  static class PluginMetaHolder {
+    private final Map<String, Object> original;
+    private final PluginMeta meta;
+
+    PluginMetaHolder(Map<String, Object> original) throws IOException {
+      this.original = original;
+      meta = mapper.readValue(Utils.toJSON(original), PluginMeta.class);
+    }
+  }
+  @SuppressWarnings("unchecked")
   public synchronized void refresh() {
     Map<String, Object> pluginInfos = null;
     try {
@@ -122,19 +136,18 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       log.error("Could not read plugins data", e);
       return;
     }
-    Map<String,PluginMeta> newState = new HashMap<>(pluginInfos.size());
+    Map<String,PluginMetaHolder> newState = new HashMap<>(pluginInfos.size());
     for (Map.Entry<String, Object> e : pluginInfos.entrySet()) {
       try {
-        newState.put(e.getKey(),
-            mapper.readValue(Utils.toJSON(e.getValue()), PluginMeta.class));
+        newState.put(e.getKey(),new PluginMetaHolder((Map<String, Object>) e.getValue()));
       } catch (Exception exp) {
         log.error("Invalid apiInfo configuration :", exp);
       }
     }
 
-    Map<String, PluginMeta> currentState = new HashMap<>();
+    Map<String, PluginMetaHolder> currentState = new HashMap<>();
     for (Map.Entry<String, ApiInfo> e : currentPlugins.entrySet()) {
-      currentState.put(e.getKey(), e.getValue().info);
+      currentState.put(e.getKey(), e.getValue().holder);
     }
     Map<String, Diff> diff = compareMaps(currentState, newState);
     if (diff == null) return;//nothing has changed
@@ -153,10 +166,10 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
         }
       } else {
         //ADDED or UPDATED
-        PluginMeta info = newState.get(e.getKey());
+        PluginMetaHolder info = newState.get(e.getKey());
         ApiInfo apiInfo = null;
         List<String> errs = new ArrayList<>();
-        apiInfo = new ApiInfo(info, errs);
+        apiInfo = new ApiInfo(info,errs);
         if (!errs.isEmpty()) {
           log.error(StrUtils.join(errs, ','));
           continue;
@@ -243,8 +256,10 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
   public class ApiInfo implements ReflectMapWriter {
     List<ApiHolder> holders;
 
+    private final PluginMetaHolder holder;
+
     @JsonProperty
-    private final PluginMeta info;
+    private PluginMeta info;
 
     @JsonProperty(value = "package")
     public final String pkg;
@@ -272,8 +287,9 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       return info.copy();
     }
     @SuppressWarnings({"unchecked","rawtypes"})
-    public ApiInfo(PluginMeta info, List<String> errs) {
-      this.info = info;
+    public ApiInfo(PluginMetaHolder infoHolder, List<String> errs) {
+      this.holder = infoHolder;
+      this.info = infoHolder.meta;
       PluginInfo.ClassName klassInfo = new PluginInfo.ClassName(info.klass);
       pkg = klassInfo.pkg;
       if (pkg != null) {
@@ -349,7 +365,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       }
     }
 
-    @SuppressWarnings({"rawtypes"})
+    @SuppressWarnings({"rawtypes","unchecked"})
     public void init() throws Exception {
       if (this.holders != null) return;
       Constructor constructor = klas.getConstructors()[0];
@@ -360,6 +376,14 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       } else {
         throw new RuntimeException("Must have a no-arg constructor or CoreContainer constructor ");
       }
+      if (instance instanceof ConfigurablePlugin) {
+        Class c = getConfigObj(instance);
+        if(c != null) {
+          Object initVal =  mapper.readValue(Utils.toJSON(holder.original), c);
+          ((ConfigurablePlugin) instance).initConfig(initVal);
+        }
+
+      }
       if (instance instanceof ResourceLoaderAware) {
         try {
           ((ResourceLoaderAware) instance).inform(pkgVersion.getLoader());
@@ -372,9 +396,27 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
         holders.add(new ApiHolder((AnnotatedApi) api));
       }
     }
+
+    @SuppressWarnings("rawtypes")
+    private Class getConfigObj(Object o) {
+      Type[] interfaces = o.getClass().getGenericInterfaces();
+      for (Type type : interfaces) {
+        if (type instanceof ParameterizedType) {
+          ParameterizedType parameterizedType = (ParameterizedType) type;
+          if(parameterizedType.getRawType() == ConfigurablePlugin.class) {
+            return (Class) parameterizedType.getActualTypeArguments()[0];
+          }
+        }
+      }
+      return null;
+    }
   }
 
-  public ApiInfo createInfo(PluginMeta info, List<String> errs) {
+  public ApiInfo createInfo(Map<String,Object> info, List<String> errs) throws IOException {
+    return new ApiInfo(new PluginMetaHolder(info), errs);
+
+  }
+  public ApiInfo createInfo(PluginMetaHolder info, List<String> errs) {
     return new ApiInfo(info, errs);
 
   }
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java b/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java
index aff5484..4e3f7f5 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ContainerPluginsApi.java
@@ -94,7 +94,7 @@ public class ContainerPluginsApi {
           payload.addError(info.name + " already exists");
           return null;
         }
-        map.put(info.name, info);
+        map.put(info.name, payload.getDataMap());
         return map;
       });
     }
@@ -129,7 +129,7 @@ public class ContainerPluginsApi {
     }
   }
 
-  private void validateConfig(PayloadObj<PluginMeta> payload, PluginMeta info) {
+  private void validateConfig(PayloadObj<PluginMeta> payload, PluginMeta info) throws IOException {
     if (info.klass.indexOf(':') > 0) {
       if (info.version == null) {
         payload.addError("Using package. must provide a packageVersion");
@@ -137,7 +137,7 @@ public class ContainerPluginsApi {
       }
     }
     List<String> errs = new ArrayList<>();
-    ContainerPluginsRegistry.ApiInfo apiInfo = coreContainer.getContainerPluginsRegistry().createInfo(info, errs);
+    ContainerPluginsRegistry.ApiInfo apiInfo = coreContainer.getContainerPluginsRegistry().createInfo( payload.getDataMap(),  errs);
     if (!errs.isEmpty()) {
       for (String err : errs) payload.addError(err);
       return;
diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index 3465a5b..79e3458 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -28,6 +28,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.lucene.util.ResourceLoader;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.api.Command;
+import org.apache.solr.api.ConfigurablePlugin;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -41,6 +42,7 @@ import org.apache.solr.cloud.ClusterSingleton;
 import org.apache.solr.cloud.MiniSolrCloudCluster;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.NavigableObject;
+import org.apache.solr.common.annotation.JsonProperty;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrResourceLoader;
@@ -185,6 +187,28 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       assertTrue("ccProvided", C6.ccProvided);
       assertTrue("startCalled", C6.startCalled);
       assertFalse("stopCalled", C6.stopCalled);
+
+      CConfig p = new CConfig();
+      p.boolVal = Boolean.TRUE;
+      p.strVal = "Something";
+      p.longVal = 1234L;
+      p.name = "hello";
+      p.klass = CC.class.getName();
+
+      new V2Request.Builder("/cluster/plugin")
+          .forceV2(true)
+          .withMethod(POST)
+          .withPayload(singletonMap("add", p))
+          .build()
+          .process(cluster.getSolrClient());
+      TestDistribPackageStore.assertResponseValues(10,
+          () -> new V2Request.Builder("hello/plugin")
+              .forceV2(true)
+              .withMethod(GET)
+              .build().process(cluster.getSolrClient()),
+          ImmutableMap.of("/config/boolVal", "true", "/config/strVal", "Something","/config/longVal", "1234" ));
+
+
       // kill the Overseer leader
       for (JettySolrRunner jetty : cluster.getJettySolrRunners()) {
         if (!jetty.getCoreContainer().getZkController().getOverseer().isClosed()) {
@@ -312,6 +336,39 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     }
   }
 
+  public static class CC implements ConfigurablePlugin<CConfig> {
+    private CConfig cfg;
+
+
+
+    @Override
+    public void initConfig(CConfig cfg) {
+      this.cfg = cfg;
+
+    }
+
+    @EndPoint(method = GET,
+        path = "/hello/plugin",
+        permission = PermissionNameProvider.Name.READ_PERM)
+    public void m2(SolrQueryRequest req, SolrQueryResponse rsp) {
+      rsp.add("config", cfg);
+    }
+
+  }
+
+  public static class CConfig extends PluginMeta {
+
+    @JsonProperty
+    public String strVal;
+
+    @JsonProperty
+    public Long longVal;
+
+    @JsonProperty
+    public Boolean boolVal;
+
+  }
+
   public static class C6 implements ClusterSingleton {
     static boolean startCalled = false;
     static boolean stopCalled = false;
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java
index e6cef30..bc32d94 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java
@@ -87,6 +87,7 @@ public class JsonSchemaCreator {
       if(p.required()) required.add(name);
     }
     if(!required.isEmpty()) map.put("required", new ArrayList<>(required));
+     map.put("additionalProperties", true);
 
   }
 }