"state" == details, and we already return the details of things
without needing to use a word like either details or "state" in the
path.

RE /api/collections/:  As long as the base shape stays an array and
doesn't become an object, I think the sub-shape of each list entry
being a string or an object is reasonable.  But happy to hear other
ideas too!

On Fri, Oct 2, 2026 at 12:52 PM Jan Høydahl <[email protected]> wrote:
>
> 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]
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to