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

Serhiy Bzhezytskyy commented on SOLR-3284:
------------------------------------------

Reopening this from a production angle. We use ConcurrentUpdateSolrClient (via 
the Builder) to index into Solr, and when a batch fails the only signal is 
handleError(Throwable) — the exception, but not which documents didn't make it. 
So we can't route the failed docs to a retry queue / DLQ; we just know 
something in the batch failed.

[~dsmiley] suggested a Builder-configurable handler here back in 2016. I have 
that working locally and it fits our case well:

new ConcurrentUpdateJdkSolrClient.Builder(url, httpClient)
.withErrorHandler((ex, request, collection) -> {
for (SolrInputDocument doc : request.getDocuments()) {
// route the doc that didn't reach the server to retry / DLQ
}
})
.build();

The handler gets the failed UpdateRequest (so, its documents) plus the 
collection. The caller reads whatever field is their uniqueKey — the client 
doesn't assume one. Default with no handler stays as-is (logs), so it's 
backward compatible.

Two things I'd want a committer's call on before I open a PR:

1. Default behavior. I kept it optional + log-by-default for compatibility. The 
2016 discussion leaned toward surfacing errors by default (throw if no 
handler). Which do you prefer?
2. Error-loop behavior. To pass the request to the handler I had to catch 
failures per-update inside the runner loop. A side effect is the runner now 
continues to the next batch instead of exiting on error. That seems better (one 
bad batch doesn't stall the runner), but it's a behavior change worth flagging.

Side note I hit while testing: RemoteSolrException(host, code, remoteError) 
NPEs when remoteError is null (the ctor does Map.of("remoteError", 
remoteError), which rejects null values) — happens when the server returns an 
error body that doesn't parse. Unrelated to this, probably its own issue.

Is there appetite for this? If so I'll put up a PR scoped to the 
Builder-handler approach above.

> ConcurrentUpdateSolrClient swallows exceptions
> ----------------------------------------------
>
>                 Key: SOLR-3284
>                 URL: https://issues.apache.org/jira/browse/SOLR-3284
>             Project: Solr
>          Issue Type: Improvement
>          Components: clients - java
>    Affects Versions: 3.5, 4.0-ALPHA
>            Reporter: Shawn Heisey
>            Assignee: Shawn Heisey
>            Priority: Major
>         Attachments: SOLR-3284.patch
>
>
> StreamingUpdateSolrServer eats exceptions thrown by lower level code, such as 
> HttpClient, when doing adds.  It may happen with other methods, though I know 
> that query and deleteByQuery will throw exceptions.  I believe that this is a 
> result of the queue/Runner design.  That's what makes SUSS perform better, 
> but it means you sacrifice the ability to programmatically determine that 
> there was a problem with your update.  All errors are logged via slf4j, but 
> that's not terribly helpful except with determining what went wrong after the 
> fact.
> When using CommonsHttpSolrServer, I've been able to rely on getting an 
> exception thrown by pretty much any error, letting me use try/catch to detect 
> problems.
> There's probably enough dependent code out there that it would not be a good 
> idea to change the design of SUSS, unless there were alternate constructors 
> or additional methods available to configure new/old behavior.  Fixing this 
> is probably not trivial, so it's probably a better idea to come up with a new 
> server object based on CHSS.  This is outside my current skillset.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to