You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2020/09/22 01:46:42 UTC

[lucene-solr] 01/02: SOLR-14884: TestContainerPlugin.testApiFromPackage jenkins failures

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

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

commit 3d03a1b88c88aa5664499b59a59c477f7ff5c3e7
Author: noblepaul <no...@gmail.com>
AuthorDate: Tue Sep 22 11:20:49 2020 +1000

    SOLR-14884: TestContainerPlugin.testApiFromPackage jenkins failures
---
 .../apache/solr/api/CustomContainerPlugins.java    | 24 +++++++----
 .../src/java/org/apache/solr/pkg/PackageAPI.java   | 46 +++++++++++-----------
 .../java/org/apache/solr/pkg/PackageLoader.java    |  8 ++++
 3 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/api/CustomContainerPlugins.java b/solr/core/src/java/org/apache/solr/api/CustomContainerPlugins.java
index f24626b..ef33c3e 100644
--- a/solr/core/src/java/org/apache/solr/api/CustomContainerPlugins.java
+++ b/solr/core/src/java/org/apache/solr/api/CustomContainerPlugins.java
@@ -27,6 +27,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.lucene.analysis.util.ResourceLoaderAware;
@@ -228,16 +229,23 @@ public class CustomContainerPlugins implements ClusterPropertiesListener, MapWri
       PluginInfo.ClassName klassInfo = new PluginInfo.ClassName(info.klass);
       pkg = klassInfo.pkg;
       if (pkg != null) {
-        PackageLoader.Package p = coreContainer.getPackageLoader().getPackage(pkg);
-        if (p == null) {
-          errs.add("Invalid package " + klassInfo.pkg);
-          return;
+        Optional<PackageLoader.Package.Version> ver = coreContainer.getPackageLoader().getPackageVersion(pkg, info.version);
+        if (ver.isEmpty()) {
+          //may be we are a bit early. Do a refresh and try again
+         coreContainer.getPackageLoader().getPackageAPI().refreshPackages(null);
+         ver = coreContainer.getPackageLoader().getPackageVersion(pkg, info.version);
         }
-        this.pkgVersion = p.getVersion(info.version);
-        if (pkgVersion == null) {
-          errs.add("No such package version:" + pkg + ":" + info.version + " . available versions :" + p.allVersions());
-          return;
+        if (ver.isEmpty()) {
+          PackageLoader.Package p = coreContainer.getPackageLoader().getPackage(pkg);
+          if (p == null) {
+            errs.add("Invalid package " + klassInfo.pkg);
+            return;
+          } else {
+            errs.add("No such package version:" + pkg + ":" + info.version + " . available versions :" + p.allVersions());
+            return;
+          }
         }
+        this.pkgVersion = ver.get();
         try {
           klas = pkgVersion.getLoader().findClass(klassInfo.className, Object.class);
         } catch (Exception e) {
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 c65dd0d..6461b76 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
@@ -93,8 +93,7 @@ public class PackageAPI {
 
   private void registerListener(SolrZkClient zkClient)
       throws KeeperException, InterruptedException {
-    String path = SOLR_PKGS_PATH;
-    zkClient.exists(path,
+    zkClient.exists(SOLR_PKGS_PATH,
         new Watcher() {
 
           @Override
@@ -103,32 +102,33 @@ public class PackageAPI {
             if (Event.EventType.None.equals(event.getType())) {
               return;
             }
-            try {
-              synchronized (this) {
-                log.debug("Updating [{}] ... ", path);
-
-                // remake watch
-                final Watcher thisWatch = this;
-                final Stat stat = new Stat();
-                final byte[] data = zkClient.getData(path, thisWatch, stat, true);
-                pkgs = readPkgsFromZk(data, stat);
-                packageLoader.refreshPackageConf();
-              }
-            } catch (KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e) {
-              log.warn("ZooKeeper watch triggered, but Solr cannot talk to ZK: ", e);
-            } catch (KeeperException e) {
-              log.error("A ZK error has occurred", e);
-              throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, "", e);
-            } catch (InterruptedException e) {
-              // Restore the interrupted status
-              Thread.currentThread().interrupt();
-              log.warn("Interrupted", e);
+            synchronized (this) {
+              log.debug("Updating [{}] ... ", SOLR_PKGS_PATH);
+              // remake watch
+              final Watcher thisWatch = this;
+              refreshPackages(thisWatch);
             }
           }
-
         }, true);
   }
 
+  public void refreshPackages(Watcher watcher)  {
+    final Stat stat = new Stat();
+    try {
+      final byte[] data = coreContainer.getZkController().getZkClient().getData(SOLR_PKGS_PATH, watcher, stat, true);
+      pkgs = readPkgsFromZk(data, stat);
+      packageLoader.refreshPackageConf();
+    } catch (KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e) {
+      log.warn("ZooKeeper watch triggered, but Solr cannot talk to ZK: ", e);
+    } catch (KeeperException e) {
+      log.error("A ZK error has occurred", e);
+      throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, "", e);
+    } catch (InterruptedException e) {
+      // Restore the interrupted status
+      Thread.currentThread().interrupt();
+      log.warn("Interrupted", e);
+    }
+  }
 
   private Packages readPkgsFromZk(byte[] data, Stat stat) throws KeeperException, InterruptedException {
 
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 1e2fc57..e3ad675 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
@@ -31,6 +31,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -61,6 +62,12 @@ public class PackageLoader implements Closeable {
   private PackageAPI packageAPI;
 
 
+  public Optional<Package.Version> getPackageVersion(String pkg, String version) {
+    Package p = packageClassLoaders.get(pkg);
+    if(p == null) return Optional.empty();
+    return Optional.ofNullable(p.getVersion(version));
+  }
+
   public PackageLoader(CoreContainer coreContainer) {
     this.coreContainer = coreContainer;
     packageAPI = new PackageAPI(coreContainer, this);
@@ -227,6 +234,7 @@ public class PackageLoader implements Closeable {
     }
 
     public Version getVersion(String version) {
+      if(version == null) return getLatest();
       return myVersions.get(version);
     }