From 5d407a1a9112817565fc54b73d9a8d286c6a3032 Mon Sep 17 00:00:00 2001 From: Yash Goswami Date: Sat, 25 Jul 2026 12:54:07 +0530 Subject: [PATCH 1/5] SOLR-18318: Fix NPE in GetNodeSystemInfo when nodes param is set --- .../client/api/model/NodeSystemResponse.java | 3 +- .../api/GetNodeSystemInfoSolrCloudTest.java | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java diff --git a/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java index 1971e323dcd2..1c2f4aeda40b 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java @@ -23,13 +23,14 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.LinkedHashMap; /** Response from /node/system */ public class NodeSystemResponse extends SolrJerseyResponse { // TODO The typing here is kindof wonky - can I tighten 'Object' here to be NodeSystemResponse or // will Jackson choke on that? - public Map remoteNodeData; + public Map remoteNodeData= new LinkedHashMap<>(); @JsonAnyGetter public Map remoteNodeData() { diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java new file mode 100644 index 000000000000..1f3d8f5b3cb4 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java @@ -0,0 +1,38 @@ +package org.apache.solr.handler.admin.api; + +import org.apache.solr.client.solrj.request.CollectionAdminRequest; +import org.apache.solr.cloud.SolrCloudTestCase; +import org.junit.BeforeClass; +import org.junit.Test; +import org.apache.solr.client.solrj.request.SystemApi; +public class GetNodeSystemInfoSolrCloudTest extends SolrCloudTestCase { + + @BeforeClass + public static void setupCluster() throws Exception { + configureCluster(1) + .addConfig("conf", configset("cloud-minimal")) + .configure(); + CollectionAdminRequest.createCollection( + DEFAULT_TEST_COLLECTION_NAME, "conf", 1, 1) + .process(cluster.getSolrClient()); + } + + @Test + public void testGetNodeInfoWithNodesParam() throws Exception { + String nodeName = + cluster.getJettySolrRunners() + .get(0) + .getCoreContainer() + .getZkController() + .getNodeName(); + + final var req = new SystemApi.GetNodeSystemInfo(); + req.setNodes(nodeName); + + final var infoRsp = req.process(cluster.getSolrClient()); + + assertEquals(0, infoRsp.responseHeader.status); + assertNotNull(infoRsp.remoteNodeData); + assertTrue(infoRsp.remoteNodeData.containsKey(nodeName)); + } +} From dd8ff8fef5cbbfc50270268448af900d405bffe6 Mon Sep 17 00:00:00 2001 From: Yash Goswami Date: Mon, 27 Jul 2026 13:00:18 +0530 Subject: [PATCH 2/5] SOLR-18318: Add changelog entry --- changelog/unreleased/Yashgoswami-SOLR-18318.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 changelog/unreleased/Yashgoswami-SOLR-18318.yml diff --git a/changelog/unreleased/Yashgoswami-SOLR-18318.yml b/changelog/unreleased/Yashgoswami-SOLR-18318.yml new file mode 100644 index 000000000000..895b27bc4e5d --- /dev/null +++ b/changelog/unreleased/Yashgoswami-SOLR-18318.yml @@ -0,0 +1,10 @@ +# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc + +title: > + Fix NullPointerException in GetNodeSystemInfo when the nodes parameter is provided in SolrCloud mode +type: bug +authors: + - name: Yash Goswami +links: + - name: SOLR-18318 + url: https://issues.apache.org/jira/browse/SOLR-18318 From 00b5fec4e7b00edb7e55f09aa749ab498837051d Mon Sep 17 00:00:00 2001 From: Yash Goswami Date: Wed, 29 Jul 2026 20:26:48 +0530 Subject: [PATCH 3/5] SOLR-18318: Fix changelog entry --- changelog/unreleased/Yashgoswami-SOLR-18318.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/unreleased/Yashgoswami-SOLR-18318.yml b/changelog/unreleased/Yashgoswami-SOLR-18318.yml index 895b27bc4e5d..030b8c9e6bab 100644 --- a/changelog/unreleased/Yashgoswami-SOLR-18318.yml +++ b/changelog/unreleased/Yashgoswami-SOLR-18318.yml @@ -2,7 +2,7 @@ title: > Fix NullPointerException in GetNodeSystemInfo when the nodes parameter is provided in SolrCloud mode -type: bug +type: fixed authors: - name: Yash Goswami links: From 68a07c4f6f86845cdd683a94b863162ec5cce67f Mon Sep 17 00:00:00 2001 From: Yash Goswami Date: Wed, 29 Jul 2026 20:42:30 +0530 Subject: [PATCH 4/5] SOLR-18318: Apply spotless formatting --- .../api/GetNodeSystemInfoSolrCloudTest.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java index 1f3d8f5b3cb4..578fd639a122 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetNodeSystemInfoSolrCloudTest.java @@ -1,30 +1,24 @@ package org.apache.solr.handler.admin.api; import org.apache.solr.client.solrj.request.CollectionAdminRequest; +import org.apache.solr.client.solrj.request.SystemApi; import org.apache.solr.cloud.SolrCloudTestCase; import org.junit.BeforeClass; import org.junit.Test; -import org.apache.solr.client.solrj.request.SystemApi; + public class GetNodeSystemInfoSolrCloudTest extends SolrCloudTestCase { @BeforeClass public static void setupCluster() throws Exception { - configureCluster(1) - .addConfig("conf", configset("cloud-minimal")) - .configure(); - CollectionAdminRequest.createCollection( - DEFAULT_TEST_COLLECTION_NAME, "conf", 1, 1) + configureCluster(1).addConfig("conf", configset("cloud-minimal")).configure(); + CollectionAdminRequest.createCollection(DEFAULT_TEST_COLLECTION_NAME, "conf", 1, 1) .process(cluster.getSolrClient()); } @Test public void testGetNodeInfoWithNodesParam() throws Exception { String nodeName = - cluster.getJettySolrRunners() - .get(0) - .getCoreContainer() - .getZkController() - .getNodeName(); + cluster.getJettySolrRunners().get(0).getCoreContainer().getZkController().getNodeName(); final var req = new SystemApi.GetNodeSystemInfo(); req.setNodes(nodeName); From 27fc70b7e67be55d028e069ca536fe5204be3668 Mon Sep 17 00:00:00 2001 From: Yash Goswami Date: Wed, 29 Jul 2026 21:18:20 +0530 Subject: [PATCH 5/5] SOLR-18318: Clarify remoteNodeData type --- .../org/apache/solr/client/api/model/NodeSystemResponse.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java index 1c2f4aeda40b..4b6d1964afe6 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/NodeSystemResponse.java @@ -28,9 +28,8 @@ /** Response from /node/system */ public class NodeSystemResponse extends SolrJerseyResponse { - // TODO The typing here is kindof wonky - can I tighten 'Object' here to be NodeSystemResponse or - // will Jackson choke on that? - public Map remoteNodeData= new LinkedHashMap<>(); + // Object, not NodeSystemResponse, since @JsonAnySetter below also feeds this map raw values. + public Map remoteNodeData = new LinkedHashMap<>(); @JsonAnyGetter public Map remoteNodeData() {