From 08d2df003563b710d9c542fcd1d1f5eed584d4dd Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 01:48:54 +0530 Subject: [PATCH 01/11] initial changes --- .../solr/client/api/endpoint/ConfigApi.java | 4 ++-- .../solr/handler/admin/api/GetConfig.java | 24 +++++++++++++++++-- .../solr/handler/admin/api/GetConfigAPI.java | 19 --------------- .../handler/admin/V2ConfigAPIMappingTest.java | 3 --- 4 files changed, 24 insertions(+), 26 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 49a4b018cc99..5e2b69913d68 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 @@ -75,7 +75,7 @@ ConfigZnodeVersionResponse getZnodeVersion( // "searchComponent"/"queryResponseWriter" sections; see GetConfig#toExternalComponentName) @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}") @StoreApiParameters @Operation( summary = "Fetch a config section", @@ -89,7 +89,7 @@ ConfigInfoResponse getConfigComponent( // "searchComponent"/"queryResponseWriter" sections; see GetConfig#toExternalComponentName) @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters}/{componentName}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}/{componentName}") @StoreApiParameters @Operation( summary = "Fetch a single named entry within a config section", 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 1bc7db362bd9..99a5132ca4ff 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 @@ -66,14 +66,34 @@ public class GetConfig extends JerseyResource implements ConfigApi.Get { "codecFactory", "query", "searchComponent", - "queryResponseWriter"); + "queryResponseWriter", + "luceneMatchVersion", + "initParams", + "listener", + "requestDispatcher", + "jmx", + "queryParser", + "valueSourceParser", + "transformer", + "updateProcessor", + "updateRequestProcessorChain", + "queryConverter", + "cache", + "circuitBreaker", + "expressible", + "schemaFactory", + "restManager", + "statsCache", + "recoveryStrategy", + "indexReaderFactory"); // v2-only renames: external (URL/response-key) component name -> internal SolrConfig section // name. v1's GET /config/{component} keeps using the internal names unchanged. private static final Map EXTERNAL_TO_INTERNAL_COMPONENT_NAME = Map.of( "searchComponents", "searchComponent", - "queryResponseWriters", "queryResponseWriter"); + "queryResponseWriters", "queryResponseWriter", + "listeners", "listener"); private static String toInternalComponentName(String externalName) { return EXTERNAL_TO_INTERNAL_COMPONENT_NAME.getOrDefault(externalName, externalName); 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 808bdf545f42..7ef10da34641 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 @@ -60,26 +60,7 @@ public void getSingleParamSet(SolrQueryRequest req, SolrQueryResponse rsp) { // Delete a path from this list when that section is migrated to Jersey @EndPoint( path = { - "/config/luceneMatchVersion", "/config/requestHandler", - "/config/initParams", - "/config/listener", - "/config/requestDispatcher", - "/config/jmx", - "/config/queryParser", - "/config/valueSourceParser", - "/config/transformer", - "/config/updateProcessor", - "/config/updateRequestProcessorChain", - "/config/queryConverter", - "/config/cache", - "/config/circuitBreaker", - "/config/expressible", - "/config/schemaFactory", - "/config/restManager", - "/config/statsCache", - "/config/recoveryStrategy", - "/config/indexReaderFactory", "/config/indexConfigdeletionPolicy", "/config/updateHandlerupdateLog" }, 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 6e0a2aa6e27a..c3a0771389b7 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 @@ -50,9 +50,6 @@ public void populateApiBag() { @Test public void testGetSingleComponentConfig() { assertAnnotatedApiExistsFor("GET", "/config/requestHandler"); - assertAnnotatedApiExistsFor("GET", "/config/jmx"); - assertAnnotatedApiExistsFor("GET", "/config/requestDispatcher"); - assertAnnotatedApiExistsFor("GET", "/config/luceneMatchVersion"); assertAnnotatedApiExistsFor("GET", "/config/indexConfigdeletionPolicy"); assertAnnotatedApiExistsFor("GET", "/config/updateHandlerupdateLog"); } From e7cfd8462050ba657e882c867602b672b2932f9b Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 01:50:49 +0530 Subject: [PATCH 02/11] added cl --- .../SOLR-16396-config-remaining-get-sections.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml diff --git a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml new file mode 100644 index 000000000000..1334157b577f --- /dev/null +++ b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml @@ -0,0 +1,9 @@ +title: > + Config remaining get sections +type: changed +authors: + - name: Jalaz Kumar + nick: jaykay12 +links: + - name: SOLR-16396 + url: https://issues.apache.org/jira/browse/SOLR-16396 From d05d9830298491aaefc92907e39ce87e443b821a Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 01:54:41 +0530 Subject: [PATCH 03/11] cl --- .../unreleased/SOLR-16396-config-remaining-get-sections.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml index 1334157b577f..164f2bcf97ba 100644 --- a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml +++ b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml @@ -1,5 +1,6 @@ title: > - Config remaining get sections + Migrate remaining GET /config/{component} sections to JAX-RS. + V2 renames listener to listeners (V1 unchanged) type: changed authors: - name: Jalaz Kumar From be6d423d88ac206369ad93b3fa113cb4e9728f18 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 02:10:24 +0530 Subject: [PATCH 04/11] more migrations --- .../java/org/apache/solr/client/api/endpoint/ConfigApi.java | 4 ++-- .../java/org/apache/solr/handler/admin/api/GetConfig.java | 6 ++++-- .../org/apache/solr/handler/admin/api/GetConfigAPI.java | 4 +--- .../apache/solr/handler/admin/V2ConfigAPIMappingTest.java | 2 -- 4 files changed, 7 insertions(+), 9 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 5e2b69913d68..657c3bf6f479 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 @@ -75,7 +75,7 @@ ConfigZnodeVersionResponse getZnodeVersion( // "searchComponent"/"queryResponseWriter" sections; see GetConfig#toExternalComponentName) @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}") @StoreApiParameters @Operation( summary = "Fetch a config section", @@ -89,7 +89,7 @@ ConfigInfoResponse getConfigComponent( // "searchComponent"/"queryResponseWriter" sections; see GetConfig#toExternalComponentName) @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}/{componentName}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}/{componentName}") @StoreApiParameters @Operation( summary = "Fetch a single named entry within a config section", 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 99a5132ca4ff..87b259208bc5 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 @@ -85,7 +85,9 @@ public class GetConfig extends JerseyResource implements ConfigApi.Get { "restManager", "statsCache", "recoveryStrategy", - "indexReaderFactory"); + "indexReaderFactory", + "indexConfigdeletionPolicy", + "updateHandlerupdateLog"); // v2-only renames: external (URL/response-key) component name -> internal SolrConfig section // name. v1's GET /config/{component} keeps using the internal names unchanged. @@ -272,7 +274,7 @@ private Map buildConfigMap( return jsonSafeCopy(configMap); } - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings("unchecked") private Map expandUseParams(SolrQueryRequest req, Object plugin) { Map pluginInfo; if (plugin instanceof Map) { 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 7ef10da34641..3b8f6a013758 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 @@ -60,9 +60,7 @@ public void getSingleParamSet(SolrQueryRequest req, SolrQueryResponse rsp) { // Delete a path from this list when that section is migrated to Jersey @EndPoint( path = { - "/config/requestHandler", - "/config/indexConfigdeletionPolicy", - "/config/updateHandlerupdateLog" + "/config/requestHandler" }, method = GET, permission = CONFIG_READ_PERM) 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 c3a0771389b7..a146cafef4fb 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 @@ -50,8 +50,6 @@ public void populateApiBag() { @Test public void testGetSingleComponentConfig() { assertAnnotatedApiExistsFor("GET", "/config/requestHandler"); - assertAnnotatedApiExistsFor("GET", "/config/indexConfigdeletionPolicy"); - assertAnnotatedApiExistsFor("GET", "/config/updateHandlerupdateLog"); } @Test From d25e9a23d544138c5bb8d612c8beb70fac9d2914 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 02:13:33 +0530 Subject: [PATCH 05/11] tidy up --- .../org/apache/solr/handler/SolrConfigHandler.java | 10 +--------- .../apache/solr/handler/admin/api/GetConfigAPI.java | 4 +--- 2 files changed, 2 insertions(+), 12 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 08614a0a4bc6..3f2118939481 100644 --- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java @@ -231,15 +231,7 @@ private void handleGET() { : getConfig.getConfigComponentByName( parts.get(1), componentName, req.getParams().getBool("meta", false))); } else { - Map m = getConfigDetails(parts.get(1), req); - Map val = new LinkedHashMap<>(); - val.put(parts.get(1), m.get(parts.get(1))); - String componentName = req.getParams().get("componentName"); - if (componentName != null) { - GetConfig.filterByComponentName( - val, parts.get(1), componentName, req.getParams().getBool("meta", false), req); - } - resp.add("config", val); + throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "Unregistered API endpoint"); } } } 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 3b8f6a013758..302966c3c5fc 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,9 +59,7 @@ public void getSingleParamSet(SolrQueryRequest req, SolrQueryResponse rsp) { // Every name SolrConfig.writeMap can emit. // Delete a path from this list when that section is migrated to Jersey @EndPoint( - path = { - "/config/requestHandler" - }, + path = {"/config/requestHandler"}, method = GET, permission = CONFIG_READ_PERM) public void getComponentConfig(SolrQueryRequest req, SolrQueryResponse rsp) { From 6d1ccaeef26a00cd4c7a01df4dced8084d730317 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 02:31:22 +0530 Subject: [PATCH 06/11] standard v2 plurals --- .../apache/solr/client/api/endpoint/ConfigApi.java | 12 ++++-------- .../org/apache/solr/handler/admin/api/GetConfig.java | 9 ++++++++- 2 files changed, 12 insertions(+), 9 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 657c3bf6f479..c4ca135254dd 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 @@ -70,12 +70,10 @@ ConfigZnodeVersionResponse getZnodeVersion( @Parameter(description = "Expected request-params znode version") int expectedParamsVersion); - // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS ("searchComponents" - // and "queryResponseWriters" here are the external, pluralized names for the internal - // "searchComponent"/"queryResponseWriter" sections; see GetConfig#toExternalComponentName) + // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|cache|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}") @StoreApiParameters @Operation( summary = "Fetch a config section", @@ -84,12 +82,10 @@ ConfigInfoResponse getConfigComponent( @PathParam("component") @Parameter(description = "Name of the config component") String component); - // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS ("searchComponents" - // and "queryResponseWriters" here are the external, pluralized names for the internal - // "searchComponent"/"queryResponseWriter" sections; see GetConfig#toExternalComponentName) + // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParser|valueSourceParser|transformer|updateProcessor|updateRequestProcessorChain|queryConverter|cache|circuitBreaker|expressible|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}/{componentName}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|cache|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}/{componentName}") @StoreApiParameters @Operation( summary = "Fetch a single named entry within a config section", 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 87b259208bc5..a10dc7692bbe 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 @@ -95,7 +95,14 @@ public class GetConfig extends JerseyResource implements ConfigApi.Get { Map.of( "searchComponents", "searchComponent", "queryResponseWriters", "queryResponseWriter", - "listeners", "listener"); + "listeners", "listener", + "queryParsers", "queryParser", + "valueSourceParsers", "valueSourceParser", + "transformers", "transformer", + "updateProcessors", "updateProcessor", + "queryConverters", "queryConverter", + "expressibles", "expressible", + "", ""); private static String toInternalComponentName(String externalName) { return EXTERNAL_TO_INTERNAL_COMPONENT_NAME.getOrDefault(externalName, externalName); From 33f8d38c25088918447760362f65d517f8e4427d Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 02:38:31 +0530 Subject: [PATCH 07/11] more changes --- .../unreleased/SOLR-16396-config-remaining-get-sections.yml | 3 ++- .../src/java/org/apache/solr/handler/admin/api/GetConfig.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml index 164f2bcf97ba..260d64e6ba28 100644 --- a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml +++ b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml @@ -1,6 +1,7 @@ title: > Migrate remaining GET /config/{component} sections to JAX-RS. - V2 renames listener to listeners (V1 unchanged) + V2 renames listener, queryParser, valueSourceParser, transformer, updateProcessor, queryConverter and expressibles to + listeners, queryParsers, valueSourceParsers, transformers, updateProcessors, queryConverters and expressibles respectively. (V1 unchanged) type: changed authors: - name: Jalaz Kumar 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 a10dc7692bbe..74a53e3eee51 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 @@ -101,8 +101,7 @@ public class GetConfig extends JerseyResource implements ConfigApi.Get { "transformers", "transformer", "updateProcessors", "updateProcessor", "queryConverters", "queryConverter", - "expressibles", "expressible", - "", ""); + "expressibles", "expressible"); private static String toInternalComponentName(String externalName) { return EXTERNAL_TO_INTERNAL_COMPONENT_NAME.getOrDefault(externalName, externalName); From 431a0e15c142353fdff85b9129ad329a885aec7b Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 02:43:53 +0530 Subject: [PATCH 08/11] improved 404 message --- .../src/java/org/apache/solr/handler/SolrConfigHandler.java | 4 +++- 1 file changed, 3 insertions(+), 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 3f2118939481..157ee37432af 100644 --- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java @@ -231,7 +231,9 @@ private void handleGET() { : getConfig.getConfigComponentByName( parts.get(1), componentName, req.getParams().getBool("meta", false))); } else { - throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "Unregistered API endpoint"); + throw new SolrException( + SolrException.ErrorCode.NOT_FOUND, + "No config API for path: /config/" + parts.get(1)); } } } From 3b72793d8f6755ec32ef4ba1e17ae1584b32309a Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 17 Oct 2026 02:49:04 +0530 Subject: [PATCH 09/11] removed the ones which are only by-name --- .../src/java/org/apache/solr/client/api/endpoint/ConfigApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c4ca135254dd..3730423da556 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 @@ -85,7 +85,7 @@ ConfigInfoResponse getConfigComponent( // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|cache|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}/{componentName}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|initParams|listeners|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|cache|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}/{componentName}") @StoreApiParameters @Operation( summary = "Fetch a single named entry within a config section", From d1f4253796dd3e07d9b0d5aba734e9616d9ed902 Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Sat, 17 Oct 2026 23:08:30 -0400 Subject: [PATCH 10/11] Fix 500 instead of 404 for by-name lookup on non-named config sections circuitBreaker, initParams, listener, and updateRequestProcessorChain are declared without REQUIRE_NAME in SolrConfig's plugin registry, so SolrConfig#writeMap serializes them as a List rather than a name-keyed Map. GetConfig#filterByComponentName's unconditional (Map) cast then threw ClassCastException for any by-name lookup against these sections (reachable both via v1's componentName query param, pre-existing, and the new v2 GET /config/{component}/{componentName} path added here), surfacing as an uncaught 500 instead of the documented 404 convention. - filterByComponentName now checks the section's shape and throws a clean NOT_FOUND when by-name filtering doesn't apply, fixing the v1 path that predates this PR. - Also drop the 4 non-named sections from the v2 by-name @Path regex, since offering a route that can never find a match by name isn't a useful API surface. - cache has the same REQUIRE_NAME+MULTI_OK shape as the other sections already pluralized here (listener->listeners, queryParser-> queryParsers, etc.) but was left singular; renamed to caches for consistency. Verified via a throwaway reproduction test: GET .../config/circuitBreaker/x 500'd with ClassCastException before this change, now returns a clean 404. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01RzzUgiebQ8ZhhgE2E7ZZU5 --- .../solr/client/api/endpoint/ConfigApi.java | 10 +++++++--- .../apache/solr/handler/admin/api/GetConfig.java | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 6 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 3730423da556..e469c7d09e39 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 @@ -73,7 +73,7 @@ ConfigZnodeVersionResponse getZnodeVersion( // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|cache|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|luceneMatchVersion|initParams|listeners|requestDispatcher|jmx|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|caches|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory|indexConfigdeletionPolicy|updateHandlerupdateLog}") @StoreApiParameters @Operation( summary = "Fetch a config section", @@ -82,10 +82,14 @@ ConfigInfoResponse getConfigComponent( @PathParam("component") @Parameter(description = "Name of the config component") String component); - // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS + // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS. Sections without + // REQUIRE_NAME in SolrConfig's plugin registration (initParams, listeners, + // updateRequestProcessorChain, circuitBreaker) are deliberately excluded here: they're + // serialized as a List rather than a name-keyed Map, so by-name lookup isn't meaningful for + // them (see GetConfig.filterByComponentName). @GET @Path( - "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|initParams|listeners|queryParsers|valueSourceParsers|transformers|updateProcessors|updateRequestProcessorChain|queryConverters|cache|circuitBreaker|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}/{componentName}") + "/{component:updateHandler|directoryFactory|indexConfig|codecFactory|query|searchComponents|queryResponseWriters|queryParsers|valueSourceParsers|transformers|updateProcessors|queryConverters|caches|expressibles|schemaFactory|restManager|statsCache|recoveryStrategy|indexReaderFactory}/{componentName}") @StoreApiParameters @Operation( summary = "Fetch a single named entry within a config section", 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 74a53e3eee51..1388fc47ceac 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 @@ -101,7 +101,8 @@ public class GetConfig extends JerseyResource implements ConfigApi.Get { "transformers", "transformer", "updateProcessors", "updateProcessor", "queryConverters", "queryConverter", - "expressibles", "expressible"); + "expressibles", "expressible", + "caches", "cache"); private static String toInternalComponentName(String externalName) { return EXTERNAL_TO_INTERNAL_COMPONENT_NAME.getOrDefault(externalName, externalName); @@ -194,10 +195,19 @@ public static void filterByComponentName( String componentName, boolean meta, SolrQueryRequest req) { - Map pluginNameVsPluginInfo = (Map) section.get(component); - if (pluginNameVsPluginInfo == null) { + Object sectionValue = section.get(component); + if (sectionValue == null) { return; } + if (!(sectionValue instanceof Map) && !(sectionValue instanceof MapWriter)) { + // e.g. circuitBreaker, initParams, listener, updateRequestProcessorChain: plugins declared + // without REQUIRE_NAME are serialized as a List, not a name-keyed Map, so filtering by name + // doesn't apply to them. + throw new SolrException( + SolrException.ErrorCode.NOT_FOUND, + component + " does not support filtering by componentName"); + } + Map pluginNameVsPluginInfo = (Map) sectionValue; Object o = pluginNameVsPluginInfo instanceof MapWriter From 8cd2405856b2e0375f352382068421fdd5a9835c Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 19 Oct 2026 23:23:58 +0530 Subject: [PATCH 11/11] cl --- .../unreleased/SOLR-16396-config-remaining-get-sections.yml | 2 ++ .../src/java/org/apache/solr/handler/admin/api/GetConfig.java | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml index 260d64e6ba28..28e914cf0b1f 100644 --- a/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml +++ b/changelog/unreleased/SOLR-16396-config-remaining-get-sections.yml @@ -6,6 +6,8 @@ type: changed authors: - name: Jalaz Kumar nick: jaykay12 + - name: Eric Pugh + nick: epugh links: - name: SOLR-16396 url: https://issues.apache.org/jira/browse/SOLR-16396 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 1388fc47ceac..5039d6b86a34 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 @@ -200,9 +200,6 @@ public static void filterByComponentName( return; } if (!(sectionValue instanceof Map) && !(sectionValue instanceof MapWriter)) { - // e.g. circuitBreaker, initParams, listener, updateRequestProcessorChain: plugins declared - // without REQUIRE_NAME are serialized as a List, not a name-keyed Map, so filtering by name - // doesn't apply to them. throw new SolrException( SolrException.ErrorCode.NOT_FOUND, component + " does not support filtering by componentName");