Agree this is a collection state, not cluster state. But overloading the response from an existing api with a different shape based on a req parameter is not a good REST practice. Better serve the new state response through a sub path e.g. /api/collections/<coll-or-all>/state ?
Jan Høydahl > 2. okt. 2026 kl. 13:11 skrev Eric Pugh <[email protected]>: > > > >> On 2026/09/22 04:09:11 Eric Pugh wrote: >> The two situations that call the GET /api/cluster want ALL the data, so even >> if we add filtering, we will return it all. >> >> One thought is that maybe we need to add some sort of pagination? What >> do other REST apis do? Doesn’t seem like we need to invent a solution to >> the “my REST call returns a lot of data”! >> >> >> >>>> On Sep 20, 2026, at 2:33 PM, Prithvi S <[email protected]> wrote: >>> >>> Hi all, >>> >>> David, agreed. If we keep GET /api/cluster, the caller should have to say >>> what they want. I would not change v1 CLUSTERSTATUS (includeAll still >>> defaults to true). The requirement would be v2 only. >>> >>> v2 GET /api/cluster with no selecting parameters would return 400. One >>> request can still return the full collections → shards → replicas tree; it >>> is just no longer the implicit default: >>> >>> GET /api/cluster?collections=true >>> GET /api/cluster?collection=foo >>> GET /api/cluster?collection=foo&shard=shard1 >>> GET /api/cluster?node=host:8983_solr >>> >>> GET /api/cluster → 400 >>> GET /api/cluster?includeAll=true → not in v2 >>> >>> live_nodes, aliases, and cluster properties would not be on this payload. >>> They already have endpoints: >>> >>> GET /api/cluster/nodes >>> GET /api/aliases >>> GET /api/cluster/properties >>> >>> That is the operator/Admin UI shape Eric described: bulk tree in one call, >>> live nodes as a second call, no aliases/roles/properties mixed in. ?node= >>> is the eviction case from earlier in the thread. >>> >>> This is GET only; POST /api/cluster commands stay put. List-shards / >>> list-replicas remain useful for targeted reads and are not a substitute for >>> the bulk tree. >>> >>> WDYT? >>> >>> Cheers, >>> Prithvi S >>> >>>> On Sun, Sep 20, 2026 at 11:55 PM David Smiley <[email protected]> wrote: >>> >>>> If we keep the API, I recommend *requiring* consumers to specify what they >>>> want. >>>> >>>> On Fri, Sep 18, 2026 at 8:16 AM Jan Høydahl <[email protected]> wrote: >>>> >>>>> Seems that both v1 and v2 of clusterstatus API already supports filtering >>>>> url parms >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> , e.g. &collection=foo >>>>> So can we just leave the http://localhost:8983/api/cluster API supported >>>>> even if we add the individual sub state endpoints? And perhaps make sure >>>>> that consumers of the full clusterstatus do use filtering knobs if they >>>> can? >>>>> >>>>> Jan >>>>> >>>>>> 18. sep. 2026 kl. 12:25 skrev Eric Pugh < >>>> [email protected] >>>>>> : >>>>>> >>>>>> Fair! >>>>>> >>>>>> I think it might be worth maybe a sample design of what you are >>>>> thinking? Also, I can keep plowing ahead while this happens in >>>> parallel. >>>>> Or more to the point, I’m hoping Prithvi plows ahead on that JIRA ;-). >>>>>> >>>>>> Eric >>>>>> >>>>>>> On Sep 18, 2026, at 3:16 AM, Jan Høydahl <[email protected] <mailto: >>>>> [email protected]>> wrote: >>>>>>> >>>>>>> Note, I'd NOT propose GraphQL in Solr. But one single REST endpoint >>>>> could be inspired from the principles. Much like we had for the >>>>> admin/metrics/ endpoint for years, it's not all or nothing... >>>>>>> >>>>>>> Jan >>>>>>> >>>>>>>> 17. sep. 2026 kl. 20:12 skrev Eric Pugh < >>>>> [email protected]>: >>>>>>>> >>>>>>>> There is a reason people like GraphQL ;-). If we had that, I would be >>>>> interested in using it…. However, since I’m interested in just getting >>>> solr >>>>> admin and Solr-operator moving forward, and getting V2 done, that is more >>>>> my focus. But yeah, GraphQL really solves a lot of issues. >>>>>>>> >>>>>>>>> On Sep 17, 2026, at 2:03 PM, Jan Høydahl < >>>> [email protected]> >>>>> wrote: >>>>>>>>> >>>>>>>>> Perhaps an endpoint offering a GraphQl inspired contract would be >>>>> practical? You declare in the request what parts and detail level of the >>>>> state you need and get just that back. Not instead of the targeted >>>>> endpoints but a supplement? >>>>>>>>> >>>>>>>>> Jan Høydahl >>>>>>>>> >>>>>>>>>> 16. sep. 2026 kl. 18:42 skrev Eric Pugh < >>>>> [email protected]>: >>>>>>>>>> >>>>>>>>>> I’ve opened https://issues.apache.org/jira/browse/SOLR-18450 >>>>>>>>>> <https://issues.apache.org/jira/browse/SOLR-18450> < >>>>> https://issues.apache.org/jira/browse/SOLR-18450 >>>>> <https://issues.apache.org/jira/browse/SOLR-18450>> < >>>>> https://issues.apache.org/jira/browse/SOLR-18450 >>>>> <https://issues.apache.org/jira/browse/SOLR-18450> < >>>>> https://issues.apache.org/jira/browse/SOLR-18450 >>>>> <https://issues.apache.org/jira/browse/SOLR-18450>>> which is to capture >>>>> the idea of keeping the guts of what CLUSTERSTATUS does, under the >>>>> /api/cluster name space, but we remove the additional various bit of data >>>>> like “liveNodes” that are returned by other APIs, but still meet the >>>>> performance characteristics/need that Solr-operator or the Solr Admin >>>> Graph >>>>> view need. >>>>>>>>>> >>>>>>>>>> I believe that Prithvi is going to move this work forward, and it >>>>> may replace/reuse his V@ list replicas and list shards API work. >>>>>>>>>> >>>>>>>>>> Eric >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> On Sep 10, 2026, at 9:25 AM, David Smiley <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>>>>>>>> >>>>>>>>>>>> On Thu, Sep 10, 2026 at 8:13 AM Eric Pugh < >>>>> [email protected] <mailto:[email protected]> >>>>> <mailto:[email protected]>> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Jason, you weren’t wrong! So, I dug into Solr-operator and >>>>> apparently it >>>>>>>>>>>> calls CLUSTERSTATE all the time and wants ALL THE DATA…. And >>>>> apparently >>>>>>>>>>>> it wants it ALL THE TIME. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Here are the two current CLUSTERSTATUS usages in solr-operator: >>>>>>>>>>>> >>>>>>>>>>>> 1. getReplicasForPod (controllers/solr_cluster_ops_util.go:701) — >>>>> called >>>>>>>>>>>> from evictSinglePod during a managed scale-down. Fetches full >>>>> CLUSTERSTATUS >>>>>>>>>>>> (no collection param), walks every collection/shard/replica >>>>> looking for any >>>>>>>>>>>> replica whose node_name matches the pod being evicted, to >>>>> determine whether >>>>>>>>>>>> the pod is safe to terminate. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> IMO this use-case is worthy of an endpoint. Basically a >>>> NODESTATUS / >>>>>>>>>>> CLUSTERNODESTATUS -- list stuff *on this node*. Basically a >>>> filtered >>>>>>>>>>> collection/shard/replica hiearchy to only replicas on the node. >>>>>>>>>>> >>>>>>>>>>> Or alternatively a parameter to the collection list api to filter >>>>> listed >>>>>>>>>>> collections to those with a replica on a target node. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> 2. GetNodeReplicaState (controllers/util/solr_update_util.go:124) >>>>> — called >>>>>>>>>>>> from handleManagedCloudRollingUpdate during a managed rolling >>>>> update. >>>>>>>>>>>> Fetches full CLUSTERSTATUS plus a separate OVERSEERSTATUS call, >>>>> aggregates >>>>>>>>>>>> per-node leader/replica/active-shard counts via >>>>> findSolrNodeContents, and >>>>>>>>>>>> feeds DeterminePodsSafeToUpdate's decision about which >>>> out-of-date >>>>> pod to >>>>>>>>>>>> restart next. >>>>>>>>>>>> >>>>>>>>>>>> Apparently, this is what the query load would look like under >>>> what >>>>> I had >>>>>>>>>>>> proposed to break up cluster status: >>>>>>>>>>>> >>>>>>>>>>>> Under the proposed hierarchy, reconstructing the same picture >>>>> needs: >>>>>>>>>>>> >>>>>>>>>>>> Requests needed to replace 1 CLUSTERSTATUS call: >>>>>>>>>>>> >>>>>>>>>>>> GET /api/collections 1 call >>>>>>>>>>>> GET /api/collections/{c}/shards (per collection) C calls >>>>>>>>>>>> GET /api/collections/{c}/shards/{s}/replicas (per shard) C x S >>>>>>>>>>>> calls >>>>>>>>>>>> ------------------------------------------------------ >>>>>>>>>>>> Total 1 + C + (C x S) >>>>>>>>>>>> >>>>>>>>>>>> Example: C=20 collections, S=4 shards each >>>>>>>>>>>> 1 + 20 + (20 x 4) = 101 requests (vs. 1 today) >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Doesn't V2 have a way to return the complete collection geometry >>>>> for a >>>>>>>>>>> collection? If it doesn't; it should! >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> So, not totally sure what to do with that information? >>>>>>>>>>>> >>>>>>>>>>>> Digging a bit more, it turns out that one thing that makes >>>>> CLUSTERSTATUS >>>>>>>>>>>> not restful is the set of booleans that we pass in ( >>>>>>>>>>>> >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>>> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>> < >>>>> >>>> https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters >>>> >>>> <https://solr.apache.org/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus-parameters> >>>>>>>> ). >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> I looked again at solr-operator and Solr Admin UI, and both do >>>>> want the >>>>>>>>>>>> the full collections→shards→replicas tree that we have today as >>>>> well as the >>>>>>>>>>>> set of live nodes. However, neither wants aliases, roles, or >>>>> cluster >>>>>>>>>>>> properties. >>>>>>>>>>>> >>>>>>>>>>>> So, now I am thinking that maybe we update the v2 /api/cluster >>>>> endpoint to >>>>>>>>>>>> continue to return the collections→shards→replicas tree, but >>>>> remove the >>>>>>>>>>>> liveNodes,clusterProperties, aliases, roles parameters, since we >>>>> have >>>>>>>>>>>> existing APIs that provide that. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> +1. >>>>>>>>>>> And with a node filter? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Apparently, that redoes the math for Solr Operator and only >>>>> requires one >>>>>>>>>>>> more call to /api/cluster/nodes than we have today, solving that >>>>> problem of >>>>>>>>>>>> lots of extra calls… >>>>>>>>>>>> >>>>>>>>>>>> We may still want to add the GET /api/collections/{c}/shards and >>>>> GET >>>>>>>>>>>> /api/collections/{c}/shards/{s}/replicas, but now they are much >>>>> less >>>>>>>>>>>> important. >>>>>>>>>>>> >>>>>>>>>>>> Thoughts? >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Eric >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> ~ David >>>>>>>>>> >>>>>>>>>> Disclaimer >>>>>>>>>> >>>>>>>>>> The information contained in this communication from the sender is >>>>> confidential. It is intended solely for use by the recipient and others >>>>> authorized to receive it. If you are not the recipient, you are hereby >>>>> notified that any disclosure, copying, distribution or taking action in >>>>> relation of the contents of this information is strictly prohibited and >>>> may >>>>> be unlawful. >>>>>>>>>> >>>>>>>>>> This email has been scanned for viruses and malware, and may have >>>>> been automatically archived by Mimecast, a leader in email security and >>>>> cyber resilience. Mimecast integrates email defenses with brand >>>> protection, >>>>> security awareness training, web security, compliance and other essential >>>>> capabilities. Mimecast helps protect large and small organizations from >>>>> malicious activity, human error and technology failure; and to lead the >>>>> movement toward building a more resilient world. To find out more, visit >>>>> our website. >>>>>>>>> >>>>>>>>> >>>> --------------------------------------------------------------------- >>>>>>>>> To unsubscribe, e-mail: [email protected] >>>>>>>>> For additional commands, e-mail: [email protected] >>>>>>>> >>>>>>>> Disclaimer >>>>>>>> >>>>>>>> The information contained in this communication from the sender is >>>>> confidential. It is intended solely for use by the recipient and others >>>>> authorized to receive it. If you are not the recipient, you are hereby >>>>> notified that any disclosure, copying, distribution or taking action in >>>>> relation of the contents of this information is strictly prohibited and >>>> may >>>>> be unlawful. >>>>>>>> >>>>>>>> This email has been scanned for viruses and malware, and may have >>>> been >>>>> automatically archived by Mimecast, a leader in email security and cyber >>>>> resilience. Mimecast integrates email defenses with brand protection, >>>>> security awareness training, web security, compliance and other essential >>>>> capabilities. Mimecast helps protect large and small organizations from >>>>> malicious activity, human error and technology failure; and to lead the >>>>> movement toward building a more resilient world. To find out more, visit >>>>> our website. >>>>>>> >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: [email protected] <mailto: >>>>> [email protected]> >>>>>>> For additional commands, e-mail: [email protected] <mailto: >>>>> [email protected]> >>>>>> >>>>>> Disclaimer >>>>>> >>>>>> The information contained in this communication from the sender is >>>>> confidential. It is intended solely for use by the recipient and others >>>>> authorized to receive it. If you are not the recipient, you are hereby >>>>> notified that any disclosure, copying, distribution or taking action in >>>>> relation of the contents of this information is strictly prohibited and >>>> may >>>>> be unlawful. >>>>>> >>>>>> This email has been scanned for viruses and malware, and may have been >>>>> automatically archived by Mimecast, a leader in email security and cyber >>>>> resilience. Mimecast integrates email defenses with brand protection, >>>>> security awareness training, web security, compliance and other essential >>>>> capabilities. Mimecast helps protect large and small organizations from >>>>> malicious activity, human error and technology failure; and to lead the >>>>> movement toward building a more resilient world. To find out more, visit >>>>> our website. >>>>> >>>>> >>>> >> >> Disclaimer >> >> The information contained in this communication from the sender is >> confidential. It is intended solely for use by the recipient and others >> authorized to receive it. If you are not the recipient, you are hereby >> notified that any disclosure, copying, distribution or taking action in >> relation of the contents of this information is strictly prohibited and may >> be unlawful. >> >> This email has been scanned for viruses and malware, and may have been >> automatically archived by Mimecast, a leader in email security and cyber >> resilience. Mimecast integrates email defenses with brand protection, >> security awareness training, web security, compliance and other essential >> capabilities. Mimecast helps protect large and small organizations from >> malicious activity, human error and technology failure; and to lead the >> movement toward building a more resilient world. To find out more, visit our >> website. >> > > > I read back over David's comment on the JIRA that he thought this all belongs > in /api/collections. I did some more poking and I think he is right. > > We have two places where we want a "cluster view", and we basically get all > the data, and then collapse it. > > So here is what I think is a better node specific result to power what > solr-operator wants: > > GET /api/cluster/nodes/{nodeName} (new — doesn't exist yet; shape drawn from > solr-operator's own SolrNodeContents) > > { > "nodeName": "localhost:8983_solr", > "live": true, > "overseerLeader": false, > "leaders": 3, > "replicas": 7, > "collections": { > "techproducts": { > "shard1": { "totalReplicas": 1, "activeReplicas": 1, "downReplicas": 0 } > }, > "gettingstarted": { > "shard1": { "totalReplicas": 2, "activeReplicas": 2, "downReplicas": 0 }, > "shard2": { "totalReplicas": 2, "activeReplicas": 1, "downReplicas": 1 } > } > } > } > Answers "what's on this node" directly — replica/leader counts, per-shard > breakdown, overseer status — without fetching every collection in the cluster > first. > > > Meanwhile, we move the current work under /api/cluster to /api/collections: > > GET /api/collections?detail=true (extended — today just returns names; this > is the proposed detail version) > > { > "collections": { > "techproducts": { > "znodeVersion": 18, > "creationTimeMillis": 1790774364148, > "properties": { > "configName": "techproducts", > "nrtReplicas": 1, > "pullReplicas": 0, > "tlogReplicas": 0, > "replicationFactor": 1, > "router": { "name": "compositeId" } > }, > "activeShards": 1, > "inactiveShards": 0, > "schemaNonCompliant": ["(NONE)"], > "shards": { > "shard1": { > "state": "active", > "range": "80000000-7fffffff", > "replicas": { "total": 1, "active": 1, "down": 0, "recovering": 0, > "recovery_failed": 0 }, > "leader": { > "core": "techproducts_shard1_replica_n1", > "node_name": "localhost:8983_solr", > "base_url": "http://localhost:8983/solr", > "state": "active", > "type": "NRT", > "leader": true > } > } > } > }, > "gettingstarted": { > "znodeVersion": 4, > "properties": { "configName": "gettingstarted", "replicationFactor": 2 }, > "activeShards": 2, > "inactiveShards": 0, > "shards": { "shard1": { "...": "..." }, "shard2": { "...": "..." } } > } > } > } > Same per-collection shape as today's GET /api/collections/{name}, just keyed > by collection name instead of returning one. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
