You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Shawn Heisey (JIRA)" <ji...@apache.org> on 2017/05/21 17:07:04 UTC

[jira] [Comment Edited] (SOLR-10428) CloudSolrClient: Qerying multiple collection aliases leads to SolrException: Collection not found

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

Shawn Heisey edited comment on SOLR-10428 at 5/21/17 5:06 PM:
--------------------------------------------------------------

The javadoc for the query method you are talking about doesn't say "collections".  It says "collection".

http://lucene.apache.org/solr/6_5_1/solr-solrj/org/apache/solr/client/solrj/SolrClient.html#query-java.lang.String-org.apache.solr.common.params.SolrParams-org.apache.solr.client.solrj.SolrRequest.METHOD-

I've never heard any mention of being able to use a comma-separated list of collections in that parameter, but the presence of that getCollectionNames method suggests that my knowledge may have some holes.  If the intent really is to allow a list of collections, perhaps the javadoc on SolrClient needs a little work.  I suspect that the multiple collections capability only applies to CloudSolrClient, which might mean that javadoc needs to be added to that class instead of changing what SolrClient's javadoc says.

One thing that would likely work right now is to create an alias on the server side that queries multiple collections in the cloud, and then only include that one alias in your query call.

I think I do see a bug in getCollectionNames.  In the master branch (as of right now), line 1409 says this:

{code}
        String alias = stateProvider.getAlias(collection);
{code}

I believe that "collection" should be changed to "collectionName" in that line, and that this completely explains the behavior you're seeing. This code was added by the commit that you've referenced.



was (Author: elyograg):
The javadoc for the query method you are talking about doesn't say "collections".  It says "collection".

http://lucene.apache.org/solr/6_5_1/solr-solrj/org/apache/solr/client/solrj/SolrClient.html#query-java.lang.String-org.apache.solr.common.params.SolrParams-org.apache.solr.client.solrj.SolrRequest.METHOD-

I've never heard any mention of being able to use a comma-separated list of collections in that parameter, but the presence of that getCollectionNames method suggests that my knowledge may have some holes.  If the intent really is to allow a list of collections, perhaps the javadoc on SolrClient needs a little work.  I wonder if a comma-separated list of cores would work with HttpSolrClient.

One thing that I know you CAN do with SolrCloud is create an alias on the server side that queries multiple collections in the cloud, and then only include that one alias in your query call.

I think I do see a bug in getCollectionNames.  In the master branch (as of right now), line 1409 says this:

{code}
        String alias = stateProvider.getAlias(collection);
{code}

I believe that "collection" should be changed to "collectionName" in that line, and that this completely explains the behavior you're seeing. This code was added by the commit that you've referenced.


> CloudSolrClient: Qerying multiple collection aliases leads to SolrException: Collection not found
> -------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-10428
>                 URL: https://issues.apache.org/jira/browse/SOLR-10428
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: SolrJ
>    Affects Versions: 6.4, 6.4.1, 6.4.2, 6.5, master (7.0)
>            Reporter: Philip Pock
>            Priority: Minor
>
> We have multiple collections and an alias is created for each of them. e.g.:
> alias-a -> collection-a, alias-b -> collection-b
> We search in multiple collections by passing the aliases of the collections in the collections parameter.
> {code}solrClient.query("alias-a,alias-b", params, SolrRequest.METHOD.POST){code}
> The client can't find the collection and throws an Exception. Relevant parts of the stacktrace using v6.5.0:
> {noformat}
> org.apache.solr.common.SolrException: Collection not found: collection-a
> 	at org.apache.solr.client.solrj.impl.CloudSolrClient.getCollectionNames(CloudSolrClient.java:1394)
> 	at org.apache.solr.client.solrj.impl.CloudSolrClient.requestWithRetryOnStaleState(CloudSolrClient.java:1087)
> 	at org.apache.solr.client.solrj.impl.CloudSolrClient.request(CloudSolrClient.java:1057)
> 	at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:160)
> 	at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:974)
> {noformat}
> Everything works fine with a single alias.
> I think this issue was introduced with SOLR-9784. Please see my comment below.
> {code:title=org.apache.solr.client.solrj.impl.CloudSolrClient }
> Set<String> getCollectionNames(String collection) {
>     List<String> rawCollectionsList = StrUtils.splitSmart(collection, ",", true);
>     Set<String> collectionNames = new HashSet<>();
>     for (String collectionName : rawCollectionsList) {
>       if (stateProvider.getState(collectionName) == null) {
>         // I assume that collectionName should be passed to getAlias here
>         String alias = stateProvider.getAlias(collection);
>         if (alias != null) {
>           List<String> aliasList = StrUtils.splitSmart(alias, ",", true);
>           collectionNames.addAll(aliasList);
>           continue;
>         }
>           throw new SolrException(ErrorCode.BAD_REQUEST, "Collection not found: " + collectionName);
>         }
>       collectionNames.add(collectionName);
>     }
>     return collectionNames;
>   }
> {code}
> The suggested change is similar to the previous revision: https://github.com/apache/lucene-solr/commit/5650939a8d41b7bad584947a2c9dcedf3774b8de#diff-c8d54eacd46180b332c86c7ae448abaeL1301



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org