On Sat, 2013-10-26 at 02:14 +0200, Chris Hostetter wrote:
> I suspect that the most straight forward way to achieve what you are
> folks seem to be describing would be to add a hook into the request
> distribution processing so that you could have a custom plugin used when
> solr does "Replica r = pickReplica(shardName)" and your implimentation of
> pickReplica() would look something like (all psuedo code)...
>
> List<Replica> allInShard = clusterState.getAllLiveReplicas(shardName)
> List<Replica> candidates = new List();
> for (Replica r : allInShard) {
> if (! r.hasRole("shardIsLastResort") ) {
> candaites.add(r);
> }
> return candaidates.isEmpty() ? allInShard : candidates;
I am not vary familiar with the distribution code in Solr. I located
CloudSolrServer.request(SolrRequest request) which seems to be the place
you are talking about? It extracts replica URLs and generates a
LBHttpSolrServer.Req with that list, which it immediately used with the
LBHttpSolrServer.
As I understand it, feeding LBHttpSolrServer.Req with only shards that
are primary, would mean an exception if those shards does not answer. In
order to handle the first search against a failed primary shard
gracefully, wouldn't we need to extend the LBHttpSolrServer.Req to have
two lists, primary and lastResort, instead of one? This would also
require a rewrite of the try-retry logic in LBHttpSolrServer.
> ...if i remember correctly, there is already a hook (or there is an issue
> about adding a hook>) to let you do plugin logic like this -- [...]
I did not see one in the code and could not locate a JIRA issue. Not
that it means that it isn't there.
Thank you for your time,
Toke Eskildsen