You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by is...@apache.org on 2019/10/28 22:01:49 UTC

[lucene-solr] 04/05: add a 'refresh' command to force refresh loading of packages

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

ishan pushed a commit to branch jira/solr-13662-updated
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 2eda5490c770ad09e6647a26d10eacd36bee9530
Author: noble <no...@apache.org>
AuthorDate: Mon Oct 21 22:05:33 2019 +1100

    add a 'refresh' command to force refresh loading of packages
---
 .../src/java/org/apache/solr/pkg/PackageAPI.java   | 31 +++++++++++++++++++-
 .../java/org/apache/solr/pkg/PackageLoader.java    | 10 +++++++
 .../src/test/org/apache/solr/pkg/TestPackages.java | 34 ++++++++++++++++++++--
 3 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
index fa9f952..f9084b4 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
@@ -204,6 +204,29 @@ public class PackageAPI {
       permission = PACKAGE_EDIT_PERM)
   public class Edit {
 
+    @Command(name = "refresh")
+    public void refresh(SolrQueryRequest req, SolrQueryResponse rsp, PayloadObj<String> payload) {
+      String p = payload.get();
+      if (p == null) {
+        payload.addError("Package null");
+        return;
+      }
+      PackageLoader.Package pkg = coreContainer.getPackageLoader().getPackage(p);
+      if (pkg == null) {
+        payload.addError("No such package: " + p);
+        return;
+      }
+
+      for (String s : coreContainer.getPackageStoreAPI().shuffledNodes()) {
+        Utils.executeGET(coreContainer.getUpdateShardHandler().getDefaultHttpClient(),
+            coreContainer.getZkController().zkStateReader.getBaseUrlForNodeName(s).replace("/solr", "/api") + "/cluster/package?wt=javabin&omitHeader=true&refreshPackage=" + p,
+            Utils.JAVABINCONSUMER);
+      }
+
+
+    }
+
+
     @Command(name = "add")
     public void add(SolrQueryRequest req, SolrQueryResponse rsp, PayloadObj<AddVersion> payload) {
       if (!checkEnabled(payload)) return;
@@ -305,6 +328,12 @@ public class PackageAPI {
   public class Read {
     @Command()
     public void get(SolrQueryRequest req, SolrQueryResponse rsp) {
+      String refresh = req.getParams().get("refreshPackage");
+      if (refresh != null) {
+        packageLoader.notifyListeners(refresh);
+        return;
+      }
+
       int expectedVersion = req.getParams().getInt("expectedVersion", -1);
       if (expectedVersion != -1) {
         syncToVersion(expectedVersion);
@@ -322,7 +351,7 @@ public class PackageAPI {
       for (int i = 0; i < 10; i++) {
         log.debug("my version is {} , and expected version {}", pkgs.znodeVersion, expectedVersion);
         if (pkgs.znodeVersion >= expectedVersion) {
-          if(origVersion < pkgs.znodeVersion){
+          if (origVersion < pkgs.znodeVersion) {
             packageLoader.refreshPackageConf();
           }
           return;
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
index fb62a5f..c86e433 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
@@ -128,6 +128,16 @@ public class PackageLoader {
 
   }
 
+  public void notifyListeners(String pkg) {
+    Package p = packageClassLoaders.get(pkg);
+    if(p != null){
+      List<Package> l = Collections.singletonList(p);
+      for (SolrCore core : coreContainer.getCores()) {
+        core.getPackageListeners().packagesUpdated(l);
+      }
+    }
+  }
+
   /**
    * represents a package definition in the packages.json
    */
diff --git a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
index 92417d4..ddbf39a 100644
--- a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
+++ b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
@@ -245,13 +245,15 @@ public class TestPackages extends SolrCloudTestCase {
           return new RequestWriter.StringPayloadContentWriter("{set:{PKG_VERSIONS:{mypkg : '1.1'}}}",
               ClientUtils.TEXT_JSON);
         }
-      }
-          .process(cluster.getSolrClient()) ;
+      }.process(cluster.getSolrClient()) ;
 
       add.version = "2.1";
       add.files = Arrays.asList(new String[]{FILE3});
       req.process(cluster.getSolrClient());
 
+      //the collections mypkg is set to use version 1.1
+      //so no upgrade
+
       verifyCmponent(cluster.getSolrClient(),
           COLLECTION_NAME, "queryResponseWriter", "json1",
           "mypkg", "1.1" );
@@ -264,7 +266,35 @@ public class TestPackages extends SolrCloudTestCase {
           COLLECTION_NAME, "requestHandler", "/runtime",
           "mypkg", "1.1" );
 
+      new GenericSolrRequest(SolrRequest.METHOD.POST, "/config/params", params ){
+        @Override
+        public RequestWriter.ContentWriter getContentWriter(String expectedType) {
+          return new RequestWriter.StringPayloadContentWriter("{set:{PKG_VERSIONS:{mypkg : '2.1'}}}",
+              ClientUtils.TEXT_JSON);
+        }
+      }.process(cluster.getSolrClient()) ;
+
+      //now, let's force every collection using 'mypkg' to refresh
+      //so that it uses version 2.1
+      new V2Request.Builder("/cluster/package")
+          .withMethod(SolrRequest.METHOD.POST)
+          .withPayload("{refresh : mypkg}")
+          .forceV2(true)
+          .build()
+          .process(cluster.getSolrClient());
+
 
+      verifyCmponent(cluster.getSolrClient(),
+          COLLECTION_NAME, "queryResponseWriter", "json1",
+          "mypkg", "2.1" );
+
+      verifyCmponent(cluster.getSolrClient(),
+          COLLECTION_NAME, "searchComponent", "get",
+          "mypkg", "2.1" );
+
+      verifyCmponent(cluster.getSolrClient(),
+          COLLECTION_NAME, "requestHandler", "/runtime",
+          "mypkg", "2.1" );
 
     } finally {
       cluster.shutdown();