[ 
https://issues.apache.org/jira/browse/SOLR-9063?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15271908#comment-15271908
 ] 

David Smiley commented on SOLR-9063:
------------------------------------

Okay I chased this one down sufficiently to know what's going on.  Strictly 
speaking, there is no bug, or perhaps a small one.  In SOLR-5380 
[[email protected]] fixed a bug in CloudSolrClient involving aliases 
pointing to multiple collections, and when "collection" was not specified as a 
parameter thus relying on the default collection (an alias).  I think it's 
because when the server gets the request to a specific core, doesn't know what 
the original/unresolved alias was.  So the solution implemented as seen in the 
code now is to send the request to a collection (the alias) level URL instead 
of to a specific core, but to do this only when "collection" isn't a parameter. 
 If "collection" *is* a parameter, then the server end will know how to deal 
with it.

But I think the logic to know when to do this should be improved to go to the 
collection level URL (thus not to the core) in more constrained circumstances.  
In particular, if {{collectionNames.size() == 1}} then it can go directly to 
the core URL, as we just resolved the alias (if there even was one).  I think 
the condition to differentiate should be exactly that instead of combining in 
the current condition looking to see if "collection" was specified, if at least 
for the reason of simpler understanding.  Would this be an optimization or 
simplification?  I'm not completely sure.

Here's the snippet I propose it become:
{code:java}
            String url;
            if (collectionNames.size() > 1) {
              // If there was an alias pointing to multiple collections, we 
can't send directly to a core.  If it were
              // convenient to modify the params to add collection=(list) we 
would but it isn't.  So we send the request
              // to the collection at the node and let the server end handle 
dispatching (incl. alias resolution).
              url = 
ZkCoreNodeProps.getCoreUrl(nodeProps.getStr(ZkStateReader.BASE_URL_PROP), 
collection);
            } else {
              url = coreNodeProps.getCoreUrl();
            }
            ((!sendToLeaders || coreNodeProps.isLeader()) ? urlList2 : 
replicas).add(url);
{code}

How did I run into this?  I'm working with a codebase that wanted to make a 
request to a custom request handler that did _not_ extend SearchHandler.  It's 
expected that a request be routed to the proper shard via an explicit 
{{\_route\_}}, which we do and CloudSolrClient processes that param.  However, 
because we didn't set "collection" as a param (we relied on the default 
collection prop), CloudSolrClient ignored it's work in figuring out which shard 
to send it to and instead sent the request to the collection level.  At the 
server end, HttpSolrCall doesn't process {{\_route_}} so it arbitrarily passed 
the request to a shard that was the wrong one on the node.  If the request 
handler were a SearchHandler (it isn't), then it'd become a distributed search 
to the {{\_route\_}} handling logic in HttpShardHandler.  The solution was 
quite simple -- add "collection" and don't use the default collection setting.  
That seemed awfully weird so I spent today finding out why it didn't work.  I 
argue this _should_ work and hence I propose the simple change above.

Testing in progress...

> CloudSolrClient with _route_ shouldn't require collection param to disambig 
> cores
> ---------------------------------------------------------------------------------
>
>                 Key: SOLR-9063
>                 URL: https://issues.apache.org/jira/browse/SOLR-9063
>             Project: Solr
>          Issue Type: Bug
>          Components: SolrCloud, SolrJ
>    Affects Versions: 4.10.4
>            Reporter: David Smiley
>            Assignee: David Smiley
>
> CloudSolrClient uses {{\_route\_}} to know where to send a request  It sorta 
> works -- it'll go to an appropriate _node_.  But it will only go to the 
> correct core on that node if the {{collection}} parameter is explicitly 
> added.  In another words, it ignores the default collection configured on 
> CloudSolrClient.  It also seems to ignore "collection" parameter to the 
> protected method sendRequest for this purpose too.  As I write this, see line 
> 1139 on master.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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

Reply via email to