You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2020/07/29 08:58:19 UTC

[lucene-solr] branch branch_8_6 updated: SOLR-14671: Parsing dynamic ZK config sometimes cause NuberFormatException (#1701)

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

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


The following commit(s) were added to refs/heads/branch_8_6 by this push:
     new 8fdf54a  SOLR-14671: Parsing dynamic ZK config sometimes cause NuberFormatException (#1701)
8fdf54a is described below

commit 8fdf54a746afdfba8c640fc2db14ca4c9cd13556
Author: Jan Høydahl <ja...@users.noreply.github.com>
AuthorDate: Wed Jul 29 10:33:02 2020 +0200

    SOLR-14671: Parsing dynamic ZK config sometimes cause NuberFormatException (#1701)
    
    (cherry picked from commit ebb5219b1b7d7baba9af6653f946cc1c66b40a93)
---
 solr/CHANGES.txt                                              |  2 ++
 .../org/apache/solr/handler/admin/ZookeeperStatusHandler.java | 11 +++++++++--
 .../org/apache/solr/common/cloud/ZkDynamicConfigTest.java     |  9 ++++++++-
 .../java/org/apache/solr/common/cloud/ZkDynamicConfig.java    |  3 ++-
 4 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 288c5dd..e069caf 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -14,6 +14,8 @@ Bug Fixes
 * SOLR-14665: Revert SOLR-12845 adding of default autoscaling cluster policy, due to performance
  issues. (Ishan Chattopadhyaya, Houston Putman, ab)
 
+* SOLR-14671: Parsing dynamic ZK config sometimes cause NumberFormatException (janhoy)
+
 ==================  8.6.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/handler/admin/ZookeeperStatusHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperStatusHandler.java
index 58d827c..c0db4a7 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperStatusHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperStatusHandler.java
@@ -112,7 +112,8 @@ public class ZookeeperStatusHandler extends RequestHandlerBase {
           .map(h -> h.resolveClientPortAddress() + ":" + h.clientPort)
           .sorted().collect(Collectors.toList());
       List<String> dynamicHosts = zkDynamicConfig.getServers().stream()
-          .map(h -> h.resolveClientPortAddress() + ":" + h.clientPort)
+          .map(h -> h.resolveClientPortAddress() + ":" +
+                  (h.clientPort != null ? h.clientPort : hostsFromConnectionString.getServers().get(0).clientPort))
           .sorted().collect(Collectors.toList());
       if (!connStringHosts.containsAll(dynamicHosts)) {
         errors.add("Your ZK connection string (" + connStringHosts.size() + " hosts) is different from the " +
@@ -120,7 +121,13 @@ public class ZookeeperStatusHandler extends RequestHandlerBase {
                 "dynamic reconfiguration and will only be able to connect to the zk hosts in your connection string.");
         status = STATUS_YELLOW;
       }
-      zookeepers = zkDynamicConfig; // Clone input
+      if (zkDynamicConfig.getServers().get(0).clientPort != null) {
+        // If we have dynamic config with client ports, use this list to iterate servers
+        zookeepers = zkDynamicConfig;
+      } else {
+        // Use list from connection string since client port is missing on dynamic config from ZK
+        zookeepers = hostsFromConnectionString;
+      }
     }
     final Map<String, Object> zkStatus = new HashMap<>();
     final List<Object> details = new ArrayList<>();
diff --git a/solr/core/src/test/org/apache/solr/common/cloud/ZkDynamicConfigTest.java b/solr/core/src/test/org/apache/solr/common/cloud/ZkDynamicConfigTest.java
index 87b4772..55e9354 100644
--- a/solr/core/src/test/org/apache/solr/common/cloud/ZkDynamicConfigTest.java
+++ b/solr/core/src/test/org/apache/solr/common/cloud/ZkDynamicConfigTest.java
@@ -29,8 +29,9 @@ public class ZkDynamicConfigTest extends SolrTestCaseJ4 {
             "server.1=zoo1:2780:2783:participant;0.0.0.0:2181\n" +
             "server.2=zoo2:2781:2784:participant|zoo3:2783;2181\n" +
             "server.3=zoo3:2782:2785;zoo3-client:2181\n" +
+            "server.4=zoo4:2783:2786:participant\n" + // this assumes clientPort specified in static config
             "version=400000003");
-    assertEquals(3, parsed.size());
+    assertEquals(4, parsed.size());
 
     assertEquals("zoo1", parsed.getServers().get(0).address);
     assertEquals(Integer.valueOf(2780), parsed.getServers().get(0).leaderPort);
@@ -50,6 +51,12 @@ public class ZkDynamicConfigTest extends SolrTestCaseJ4 {
     assertNull(parsed.getServers().get(2).role);
     assertEquals("zoo3-client", parsed.getServers().get(2).clientPortAddress);
     assertEquals("zoo3-client", parsed.getServers().get(2).resolveClientPortAddress());
+
+    // client address/port optional if clientPort specified in static config file (back-compat mode)
+    assertEquals("participant", parsed.getServers().get(3).role);
+    assertEquals(null, parsed.getServers().get(3).clientPortAddress);
+    assertEquals("zoo4", parsed.getServers().get(3).resolveClientPortAddress());
+    assertEquals(null, parsed.getServers().get(3).clientPort);
   }
 
   @Test(expected = SolrException.class)
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkDynamicConfig.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkDynamicConfig.java
index ad265a3..eae32d8 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkDynamicConfig.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkDynamicConfig.java
@@ -132,6 +132,7 @@ public class ZkDynamicConfig {
       if (!m.matches()) {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Could not parse dynamic zk config line: " + line);
       }
+      String clientPortStr = m.group("clientPort");
       return new Server(
           Integer.parseInt(m.group("serverId")),
           m.group("address"),
@@ -139,7 +140,7 @@ public class ZkDynamicConfig {
           Integer.parseInt(m.group("leaderElectionPort")),
           m.group("role"),
           m.group("clientPortAddress"),
-          Integer.parseInt(m.group("clientPort"))
+          clientPortStr != null ? Integer.parseInt(clientPortStr) : null
       );
     }
   }