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:33:15 UTC

[lucene-solr] branch master 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 master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


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

commit ebb5219b1b7d7baba9af6653f946cc1c66b40a93
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)
---
 solr/CHANGES.txt                                              |  7 +++++++
 .../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, 26 insertions(+), 4 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 4f8a613..028aedd 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -167,6 +167,13 @@ Other Changes
 
 * SOLR-11868: Deprecate CloudSolrClient.setIdField, use information from Zookeeper (Erick Erickson)
 
+==================  8.6.1 ==================
+
+Bug Fixes
+---------------------
+
+* SOLR-14671: Parsing dynamic ZK config sometimes cause NuberFormatException (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 33e3244..62171cb 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 891db44..4bb4729 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
@@ -130,6 +130,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"),
@@ -137,7 +138,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
       );
     }
   }