From ed463a8029d51956cfc5d2568d56e74fb79516ab Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 3 Oct 2026 21:55:45 +0530 Subject: [PATCH 01/13] cl --- changelog/unreleased/SOLR-16396-config-get-others.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 changelog/unreleased/SOLR-16396-config-get-others.yml diff --git a/changelog/unreleased/SOLR-16396-config-get-others.yml b/changelog/unreleased/SOLR-16396-config-get-others.yml new file mode 100644 index 000000000000..e1ba9ee683e5 --- /dev/null +++ b/changelog/unreleased/SOLR-16396-config-get-others.yml @@ -0,0 +1,9 @@ +title: + Migration of Get Config V2 Remaining API to JAX-RS construct. +type: changed +authors: + - name: Jalaz Kumar + nick: jaykay12 +links: + - name: SOLR-16396 + url: https://issues.apache.org/jira/browse/SOLR-16396 From 0f5ae0a28c30b12625acd0377689dd9c47237339 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 04:14:10 +0530 Subject: [PATCH 02/13] changes done --- .../solr/client/api/endpoint/ConfigApi.java | 26 +++++ .../api/model/ConfigOverlayResponse.java | 25 +++++ .../api/model/ConfigZnodeVersionResponse.java | 32 ++++++ .../solr/handler/SolrConfigHandler.java | 99 +++++++++---------- .../solr/handler/admin/api/GetConfig.java | 26 +++++ 5 files changed, 158 insertions(+), 50 deletions(-) create mode 100644 solr/api/src/java/org/apache/solr/client/api/model/ConfigOverlayResponse.java create mode 100644 solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java index 3e0ab463af22..4511d96a31f5 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java @@ -25,6 +25,8 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.QueryParam; import org.apache.solr.client.api.model.ConfigInfoResponse; +import org.apache.solr.client.api.model.ConfigOverlayResponse; +import org.apache.solr.client.api.model.ConfigZnodeVersionResponse; import org.apache.solr.client.api.util.StoreApiParameters; /** V2 API for reading and modifying a core/collection's config */ @@ -42,5 +44,29 @@ ConfigInfoResponse getConfig( @DefaultValue("false") @Parameter(description = "Expand request handler useParams and effective parameters") boolean expandParams); + + @GET + @Path("/overlay") + @StoreApiParameters + @Operation( + summary = "Fetch the config overlay of the specified core or collection", + tags = {"config"}) + ConfigOverlayResponse getOverlay(); + + @GET + @Path("/znodeversion") + @StoreApiParameters + @Operation( + summary = "Fetch znode versions for config overlay and request params", + tags = {"config"}) + ConfigZnodeVersionResponse getZnodeVersion( + @QueryParam("overlay") + @DefaultValue("-1") + @Parameter(description = "Expected overlay znode version") + int expectedOverlayVersion, + @QueryParam("params") + @DefaultValue("-1") + @Parameter(description = "Expected request-params znode version") + int expectedParamsVersion); } } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ConfigOverlayResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ConfigOverlayResponse.java new file mode 100644 index 000000000000..e75aaf25fbac --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/ConfigOverlayResponse.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.client.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; + +public class ConfigOverlayResponse extends SolrJerseyResponse { + @JsonProperty("overlay") + public Map overlay; +} diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java new file mode 100644 index 000000000000..9375243eebb3 --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.client.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ConfigZnodeVersionResponse extends SolrJerseyResponse { + @JsonProperty("zNodeVersion") + public ZnodeVersion znodeVersion; + + public static class ZnodeVersion { + @JsonProperty("overlay") + public int overlay; + + @JsonProperty("params") + public int params; + } +} diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java index d943272657f7..08a68b46901b 100644 --- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java @@ -202,7 +202,7 @@ private void handleGET() { resp, new GetConfig(req).getConfig(req.getParams().getBool("expandParams", false))); } else { if (ConfigOverlay.NAME.equals(parts.get(1))) { - resp.add(ConfigOverlay.NAME, req.getCore().getSolrConfig().getOverlay()); + V2ApiUtils.squashIntoSolrResponseWithoutHeader(resp, new GetConfig(req).getOverlay()); } else if (RequestParams.NAME.equals(parts.get(1))) { if (parts.size() == 3) { RequestParams params = req.getCore().getSolrConfig().getRequestParams(); @@ -229,55 +229,6 @@ private void handleGET() { boolean isStale = false; int expectedVersion = req.getParams().getInt(ConfigOverlay.NAME, -1); int actualVersion = req.getCore().getSolrConfig().getOverlay().getVersion(); - if (expectedVersion > actualVersion) { - log.info( - "expecting overlay version {} but my version is {}", - expectedVersion, - actualVersion); - isStale = true; - } else if (expectedVersion != -1) { - log.info("I already have the expected version {} of config", expectedVersion); - } - expectedVersion = req.getParams().getInt(RequestParams.NAME, -1); - actualVersion = req.getCore().getSolrConfig().getRequestParams().getZnodeVersion(); - if (expectedVersion > actualVersion) { - log.info( - "expecting params version {} but my version is {}", - expectedVersion, - actualVersion); - isStale = true; - } else if (expectedVersion != -1) { - log.info("I already have the expected version {} of params", expectedVersion); - } - if (isStale && req.getCore().getResourceLoader() instanceof ZkSolrResourceLoader) { - new Thread( - () -> { - if (!reloadLock.tryLock()) { - log.info("Another reload is in progress . Not doing anything"); - return; - } - try { - log.info("Trying to update my configs"); - SolrCore.getConfListener( - req.getCore(), - (ZkSolrResourceLoader) req.getCore().getResourceLoader()) - .run(); - } catch (Exception e) { - log.error("Unable to refresh conf ", e); - } finally { - reloadLock.unlock(); - } - }, - SolrConfigHandler.class.getSimpleName() + "-refreshconf") - .start(); - } else { - if (log.isInfoEnabled()) { - log.info( - "isStale {} , resourceloader {}", - isStale, - req.getCore().getResourceLoader().getClass().getName()); - } - } } else { Map m = getConfigDetails(parts.get(1), req); @@ -970,6 +921,54 @@ public static List getActiveReplicas(ZkController zkController, String return activeReplicas; } + public static void maybeRefreshStaleConfig(SolrCore core, int expectedOverlayVersion, int expectedParamsVersion) { + boolean isStale = isExpectedVersionStale( + "overlay", expectedOverlayVersion, core.getSolrConfig().getOverlay().getVersion()) + | isExpectedVersionStale( + "params", expectedParamsVersion, core.getSolrConfig().getRequestParams().getZnodeVersion()); + + if (isStale && core.getResourceLoader() instanceof ZkSolrResourceLoader) { + final Lock reloadLock = + ((SolrConfigHandler) core.getRequestHandler("/config")).getReloadLock(); + new Thread( + () -> { + if (!reloadLock.tryLock()) { + log.info("Another reload is in progress . Not doing anything"); + return; + } + try { + log.info("Trying to update my configs"); + SolrCore.getConfListener(core, (ZkSolrResourceLoader) core.getResourceLoader()) + .run(); + } catch (Exception e) { + log.error("Unable to refresh conf ", e); + } finally { + reloadLock.unlock(); + } + }, + SolrConfigHandler.class.getSimpleName() + "-refreshconf") + .start(); + } else { + if (log.isInfoEnabled()) { + log.info("isStale {} , resourceloader {}", isStale, + core.getResourceLoader().getClass().getName()); + } + } + + } + + private static boolean isExpectedVersionStale(String label, int expected, int actual) { + if (expected == -1) { + return false; + } + if (expected > actual) { + log.info("expecting {} version {} but my version is {}", label, expected, actual); + return true; + } + log.info("I already have the expected version {} of {}", expected, label); + return false; + } + @Override public Name getPermissionName(AuthorizationContext ctx) { switch (ctx.getHttpMethod()) { diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java index d46738ea347d..8b15b6bd5a99 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java @@ -30,6 +30,8 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ConfigApi; import org.apache.solr.client.api.model.ConfigInfoResponse; +import org.apache.solr.client.api.model.ConfigOverlayResponse; +import org.apache.solr.client.api.model.ConfigZnodeVersionResponse; import org.apache.solr.common.params.MapSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.NamedList; @@ -37,6 +39,7 @@ import org.apache.solr.common.util.Utils; import org.apache.solr.core.PluginInfo; import org.apache.solr.handler.RequestHandlerBase; +import org.apache.solr.handler.SolrConfigHandler; import org.apache.solr.jersey.NullKeyTolerantMap; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; @@ -60,6 +63,29 @@ public ConfigInfoResponse getConfig(boolean expandParams) { return response; } + @Override + @PermissionName(CONFIG_READ_PERM) + public ConfigOverlayResponse getOverlay() { + final var response = instantiateJerseyResponse(ConfigOverlayResponse.class); + response.overlay = Utils.convertToMap(solrQueryRequest.getCore().getSolrConfig().getOverlay(), new LinkedHashMap<>()); + return response; + } + + @Override + @PermissionName(CONFIG_READ_PERM) + public ConfigZnodeVersionResponse getZnodeVersion(int expectedOverlayVersion, int expectedParamsVersion) { + final var response = instantiateJerseyResponse(ConfigZnodeVersionResponse.class); + final var core = solrQueryRequest.getCore(); + final var solrConfig = core.getSolrConfig(); + + response.znodeVersion = new ConfigZnodeVersionResponse.ZnodeVersion(); + response.znodeVersion.overlay = solrConfig.getOverlay().getVersion(); + response.znodeVersion.params = solrConfig.getRequestParams().getZnodeVersion(); + + SolrConfigHandler.maybeRefreshStaleConfig(core, expectedOverlayVersion, expectedParamsVersion); + return response; + } + @SuppressWarnings({"unchecked"}) private Map buildConfigMap( SolrQueryRequest solrQueryRequest, boolean expandParams) { From be553846e5602e3d326cc017d0da18eef07502b6 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 04:21:40 +0530 Subject: [PATCH 03/13] tidy --- .../solr/handler/SolrConfigHandler.java | 68 +++++++++---------- .../solr/handler/admin/api/GetConfig.java | 7 +- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java index 08a68b46901b..90512863e197 100644 --- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java @@ -219,17 +219,12 @@ private void handleGET() { } else { if (ZNODEVER.equals(parts.get(1))) { - resp.add( - ZNODEVER, - Map.of( - ConfigOverlay.NAME, - req.getCore().getSolrConfig().getOverlay().getVersion(), - RequestParams.NAME, - req.getCore().getSolrConfig().getRequestParams().getZnodeVersion())); - boolean isStale = false; - int expectedVersion = req.getParams().getInt(ConfigOverlay.NAME, -1); - int actualVersion = req.getCore().getSolrConfig().getOverlay().getVersion(); - + V2ApiUtils.squashIntoSolrResponseWithoutHeader( + resp, + new GetConfig(req) + .getZnodeVersion( + req.getParams().getInt(ConfigOverlay.NAME, -1), + req.getParams().getInt(RequestParams.NAME, -1))); } else { Map m = getConfigDetails(parts.get(1), req); Map val = new LinkedHashMap<>(); @@ -921,40 +916,45 @@ public static List getActiveReplicas(ZkController zkController, String return activeReplicas; } - public static void maybeRefreshStaleConfig(SolrCore core, int expectedOverlayVersion, int expectedParamsVersion) { - boolean isStale = isExpectedVersionStale( - "overlay", expectedOverlayVersion, core.getSolrConfig().getOverlay().getVersion()) - | isExpectedVersionStale( - "params", expectedParamsVersion, core.getSolrConfig().getRequestParams().getZnodeVersion()); + public static void maybeRefreshStaleConfig( + SolrCore core, int expectedOverlayVersion, int expectedParamsVersion) { + boolean isStale = + isExpectedVersionStale( + "overlay", expectedOverlayVersion, core.getSolrConfig().getOverlay().getVersion()) + | isExpectedVersionStale( + "params", + expectedParamsVersion, + core.getSolrConfig().getRequestParams().getZnodeVersion()); if (isStale && core.getResourceLoader() instanceof ZkSolrResourceLoader) { final Lock reloadLock = ((SolrConfigHandler) core.getRequestHandler("/config")).getReloadLock(); new Thread( - () -> { - if (!reloadLock.tryLock()) { - log.info("Another reload is in progress . Not doing anything"); - return; - } - try { - log.info("Trying to update my configs"); - SolrCore.getConfListener(core, (ZkSolrResourceLoader) core.getResourceLoader()) - .run(); - } catch (Exception e) { - log.error("Unable to refresh conf ", e); - } finally { - reloadLock.unlock(); - } - }, - SolrConfigHandler.class.getSimpleName() + "-refreshconf") + () -> { + if (!reloadLock.tryLock()) { + log.info("Another reload is in progress . Not doing anything"); + return; + } + try { + log.info("Trying to update my configs"); + SolrCore.getConfListener(core, (ZkSolrResourceLoader) core.getResourceLoader()) + .run(); + } catch (Exception e) { + log.error("Unable to refresh conf ", e); + } finally { + reloadLock.unlock(); + } + }, + SolrConfigHandler.class.getSimpleName() + "-refreshconf") .start(); } else { if (log.isInfoEnabled()) { - log.info("isStale {} , resourceloader {}", isStale, + log.info( + "isStale {} , resourceloader {}", + isStale, core.getResourceLoader().getClass().getName()); } } - } private static boolean isExpectedVersionStale(String label, int expected, int actual) { diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java index 8b15b6bd5a99..e22922f57a26 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java @@ -67,13 +67,16 @@ public ConfigInfoResponse getConfig(boolean expandParams) { @PermissionName(CONFIG_READ_PERM) public ConfigOverlayResponse getOverlay() { final var response = instantiateJerseyResponse(ConfigOverlayResponse.class); - response.overlay = Utils.convertToMap(solrQueryRequest.getCore().getSolrConfig().getOverlay(), new LinkedHashMap<>()); + response.overlay = + Utils.convertToMap( + solrQueryRequest.getCore().getSolrConfig().getOverlay(), new LinkedHashMap<>()); return response; } @Override @PermissionName(CONFIG_READ_PERM) - public ConfigZnodeVersionResponse getZnodeVersion(int expectedOverlayVersion, int expectedParamsVersion) { + public ConfigZnodeVersionResponse getZnodeVersion( + int expectedOverlayVersion, int expectedParamsVersion) { final var response = instantiateJerseyResponse(ConfigZnodeVersionResponse.class); final var core = solrQueryRequest.getCore(); final var solrConfig = core.getSolrConfig(); From 13e5fffba26401ad85328dd2844c30778475ca03 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 04:39:48 +0530 Subject: [PATCH 04/13] tests --- .../admin/api/GetConfigSolrCloudTest.java | 25 ++++++++++++++++++- .../solr/handler/admin/api/GetConfigTest.java | 23 +++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java index 297da96353d6..9e21c0de3119 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java @@ -40,7 +40,7 @@ public static void setupCluster() throws Exception { } @Test - public void testGetConfigFromCore() throws Exception { + public void testGetConfigFromCollection() throws Exception { var request = new ConfigApi.GetConfig(IndexType.COLLECTION, COLLECTION_NAME); var response = request.process(cluster.getSolrClient()); @@ -52,4 +52,27 @@ public void testGetConfigFromCore() throws Exception { assertTrue(response.config.containsKey("query")); assertTrue(response.config.containsKey("requestHandler")); } + + @Test + public void testGetOverlayFromCollection() throws Exception { + var request = new ConfigApi.GetOverlay(IndexType.COLLECTION, COLLECTION_NAME); + var response = request.process(cluster.getSolrClient()); + + assertNotNull(response); + assertNull(response.error); + assertNotNull(response.overlay); + assertTrue(response.overlay.containsKey("znodeVersion")); + } + + @Test + public void testGetZnodeVersionFromCollection() throws Exception { + var request = new ConfigApi.GetZnodeVersion(IndexType.COLLECTION, COLLECTION_NAME); + var response = request.process(cluster.getSolrClient()); + + assertNotNull(response); + assertNull(response.error); + assertNotNull(response.znodeVersion); + assertTrue(response.znodeVersion.overlay >= -1); + assertTrue(response.znodeVersion.params >= -1); + } } diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java index c122e8d497ac..6d7589cd18ca 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java @@ -56,4 +56,27 @@ public void testGetConfigFromCore() throws Exception { assertTrue(response.config.containsKey("searchComponent")); assertTrue(response.config.containsKey("updateProcessor")); } + + @Test + public void testGetOverlayFromCore() throws Exception { + var request = new ConfigApi.GetOverlay(IndexType.CORE, CORE_NAME); + var response = request.process(solrTestRule.getSolrClient(CORE_NAME)); + + assertNotNull(response); + assertNull(response.error); + assertNotNull(response.overlay); + assertTrue(response.overlay.containsKey("znodeVersion")); + } + + @Test + public void testGetZnodeVersionFromCore() throws Exception { + var request = new ConfigApi.GetZnodeVersion(IndexType.CORE, CORE_NAME); + var response = request.process(solrTestRule.getSolrClient(CORE_NAME)); + + assertNotNull(response); + assertNull(response.error); + assertNotNull(response.znodeVersion); + assertTrue(response.znodeVersion.overlay >= -1); + assertTrue(response.znodeVersion.params >= -1); + } } From b470dfc99098acbc5a6e078b4ca39e0a1c53261c Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 04:45:12 +0530 Subject: [PATCH 05/13] minor hanges --- .../java/org/apache/solr/client/api/endpoint/ConfigApi.java | 2 +- .../solr/client/api/model/ConfigZnodeVersionResponse.java | 4 ++-- .../src/java/org/apache/solr/handler/SolrConfigHandler.java | 1 - .../src/java/org/apache/solr/handler/admin/api/GetConfig.java | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java index 4511d96a31f5..cc9cecc1bb56 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java @@ -54,7 +54,7 @@ ConfigInfoResponse getConfig( ConfigOverlayResponse getOverlay(); @GET - @Path("/znodeversion") + @Path("/znodeVersion") @StoreApiParameters @Operation( summary = "Fetch znode versions for config overlay and request params", diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java index 9375243eebb3..618572e987e5 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java @@ -20,9 +20,9 @@ public class ConfigZnodeVersionResponse extends SolrJerseyResponse { @JsonProperty("zNodeVersion") - public ZnodeVersion znodeVersion; + public ZnodeVersions znodeVersion; - public static class ZnodeVersion { + public static class ZnodeVersions { @JsonProperty("overlay") public int overlay; diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java index 90512863e197..2ba88a5ba0d4 100644 --- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java @@ -925,7 +925,6 @@ public static void maybeRefreshStaleConfig( "params", expectedParamsVersion, core.getSolrConfig().getRequestParams().getZnodeVersion()); - if (isStale && core.getResourceLoader() instanceof ZkSolrResourceLoader) { final Lock reloadLock = ((SolrConfigHandler) core.getRequestHandler("/config")).getReloadLock(); diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java index e22922f57a26..80d46e7bac65 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java @@ -81,7 +81,7 @@ public ConfigZnodeVersionResponse getZnodeVersion( final var core = solrQueryRequest.getCore(); final var solrConfig = core.getSolrConfig(); - response.znodeVersion = new ConfigZnodeVersionResponse.ZnodeVersion(); + response.znodeVersion = new ConfigZnodeVersionResponse.ZnodeVersions(); response.znodeVersion.overlay = solrConfig.getOverlay().getVersion(); response.znodeVersion.params = solrConfig.getRequestParams().getZnodeVersion(); From 81c34182a37eb63783941a4808afd9bb5c3eacf8 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 04:50:29 +0530 Subject: [PATCH 06/13] minor --- .../solr/client/api/model/ConfigZnodeVersionResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java index 618572e987e5..01cecfaa73f0 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ConfigZnodeVersionResponse.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class ConfigZnodeVersionResponse extends SolrJerseyResponse { - @JsonProperty("zNodeVersion") + @JsonProperty("znodeVersion") public ZnodeVersions znodeVersion; public static class ZnodeVersions { From 80e4b87467288f26ac20978f12e37ae51c0ff2f6 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 05:00:16 +0530 Subject: [PATCH 07/13] updated cl --- changelog/unreleased/SOLR-16396-config-get-others.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/unreleased/SOLR-16396-config-get-others.yml b/changelog/unreleased/SOLR-16396-config-get-others.yml index e1ba9ee683e5..9e86c40daae1 100644 --- a/changelog/unreleased/SOLR-16396-config-get-others.yml +++ b/changelog/unreleased/SOLR-16396-config-get-others.yml @@ -1,5 +1,5 @@ title: - Migration of Get Config V2 Remaining API to JAX-RS construct. + Migration of GET /config/overlay and GET /config/znodeVersion V2 APIs to JAX-RS construct. type: changed authors: - name: Jalaz Kumar From a8a51fa6389bbbdf12ec3bb0c04328ac4dd38649 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 5 Oct 2026 13:13:43 +0530 Subject: [PATCH 08/13] cl --- changelog/unreleased/SOLR-16396-config-get-others.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/unreleased/SOLR-16396-config-get-others.yml b/changelog/unreleased/SOLR-16396-config-get-others.yml index 9e86c40daae1..56e36c32586b 100644 --- a/changelog/unreleased/SOLR-16396-config-get-others.yml +++ b/changelog/unreleased/SOLR-16396-config-get-others.yml @@ -1,5 +1,5 @@ title: - Migration of GET /config/overlay and GET /config/znodeVersion V2 APIs to JAX-RS construct. + Migrate GET /config/overlay and GET /config/znodeVersion to JAX-RS. type: changed authors: - name: Jalaz Kumar From 0844dbec13c8cf0d4ed6fd8f492c2506523ffd45 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 10 Oct 2026 05:31:40 +0530 Subject: [PATCH 09/13] precommit passes now --- .../src/java/org/apache/solr/handler/SolrConfigHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java index 2ba88a5ba0d4..d61b7d2bacbc 100644 --- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java @@ -174,7 +174,7 @@ public static boolean getImmutable(SolrCore core) { return immutable != null && Boolean.parseBoolean(immutable.toString()); } - private class Command { + private static class Command { private final SolrQueryRequest req; private final SolrQueryResponse resp; private final String method; From ec1ffd2b986f4533cb685e2cbe9bb4a90e854a83 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 10 Oct 2026 05:38:32 +0530 Subject: [PATCH 10/13] more test assertions --- .../apache/solr/handler/admin/api/GetConfigSolrCloudTest.java | 1 + .../test/org/apache/solr/handler/admin/api/GetConfigTest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java index 9e21c0de3119..7ce43a5ff3d7 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java @@ -62,6 +62,7 @@ public void testGetOverlayFromCollection() throws Exception { assertNull(response.error); assertNotNull(response.overlay); assertTrue(response.overlay.containsKey("znodeVersion")); + assertEquals(-1, response.overlay.get("znodeVersion")); } @Test diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java index 6d7589cd18ca..a17d9258a180 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java @@ -66,6 +66,7 @@ public void testGetOverlayFromCore() throws Exception { assertNull(response.error); assertNotNull(response.overlay); assertTrue(response.overlay.containsKey("znodeVersion")); + assertEquals(-1, response.overlay.get("znodeVersion")); } @Test From cf8b0220fd4c94759e20a857a2b6ba29d64206e2 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 10 Oct 2026 05:48:08 +0530 Subject: [PATCH 11/13] handling for params= --- solr/solrj/src/resources/java-template/api.mustache | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/solr/solrj/src/resources/java-template/api.mustache b/solr/solrj/src/resources/java-template/api.mustache index 4aae48285610..b8c0dce81687 100644 --- a/solr/solrj/src/resources/java-template/api.mustache +++ b/solr/solrj/src/resources/java-template/api.mustache @@ -233,14 +233,14 @@ public class {{classname}} { @Override public SolrParams getParams() { - final ModifiableSolrParams params = new ModifiableSolrParams(); + final ModifiableSolrParams solrParams = new ModifiableSolrParams(); {{#queryParams}} if ({{paramName}} != null) { - {{#isArray}}{{paramName}}.forEach(v -> params.add("{{baseName}}", v{{^items.isString}}.toString(){{/items.isString}}));{{/isArray}} - {{^isArray}}params.add("{{baseName}}", {{paramName}}{{^isString}}.toString(){{/isString}});{{/isArray}} + {{#isArray}}{{paramName}}.forEach(v -> solrParams.add("{{baseName}}", v{{^items.isString}}.toString(){{/items.isString}}));{{/isArray}} + {{^isArray}}solrParams.add("{{baseName}}", {{paramName}}{{^isString}}.toString(){{/isString}});{{/isArray}} } {{/queryParams}} - return params; + return solrParams; } @Override From b17f6c9672bc65827aa2106c5c2528a6c104eff9 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sun, 11 Oct 2026 12:29:16 +0530 Subject: [PATCH 12/13] changes --- .../java/org/apache/solr/handler/admin/api/GetConfigAPI.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java index 2a2db95683e5..6a0567c987ce 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java @@ -59,8 +59,6 @@ public void getSingleParamSet(SolrQueryRequest req, SolrQueryResponse rsp) { // Delete a path from this list when that section is migrated to Jersey @EndPoint( path = { - "/config/overlay", - "/config/znodeVersion", "/config/luceneMatchVersion", "/config/query", "/config/requestHandler", From f5aa85f8cbff9d0c9057f77c57e2dd372da1bc35 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sun, 11 Oct 2026 12:38:22 +0530 Subject: [PATCH 13/13] test correction --- .../org/apache/solr/handler/admin/V2ConfigAPIMappingTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/solr/core/src/test/org/apache/solr/handler/admin/V2ConfigAPIMappingTest.java b/solr/core/src/test/org/apache/solr/handler/admin/V2ConfigAPIMappingTest.java index 0498b25dd5c1..252946a5971f 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/V2ConfigAPIMappingTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/V2ConfigAPIMappingTest.java @@ -49,11 +49,9 @@ public void populateApiBag() { // the API lookup works for a handful of the valid config "components". @Test public void testGetSingleComponentConfig() { - assertAnnotatedApiExistsFor("GET", "/config/overlay"); assertAnnotatedApiExistsFor("GET", "/config/query"); assertAnnotatedApiExistsFor("GET", "/config/jmx"); assertAnnotatedApiExistsFor("GET", "/config/requestDispatcher"); - assertAnnotatedApiExistsFor("GET", "/config/znodeVersion"); assertAnnotatedApiExistsFor("GET", "/config/luceneMatchVersion"); assertAnnotatedApiExistsFor("GET", "/config/indexConfigdeletionPolicy"); assertAnnotatedApiExistsFor("GET", "/config/updateHandlerupdateLog");