Alexander Lapin created IGNITE-15581:
----------------------------------------
Summary: Proper business-logic exception propagation from raft
listener to client code
Key: IGNITE-15581
URL: https://issues.apache.org/jira/browse/IGNITE-15581
Project: Ignite
Issue Type: Improvement
Reporter: Alexander Lapin
*Problem.*
In case of business logic exceptions thrown from within raft listeners it's
recommended to use
{code:java}
clo.result(throwable)
{code}
Such throwable is propagated to raft client in ActionResponse container and
later on competes future with common but not exceptional way (which is a
problem):
{code:java}
return fut.thenApply(resp -> (R) resp.result());
{code}
{code:java}
@Override public <R> CompletableFuture<R> run(Command cmd) {
Peer leader = this.leader;
if (leader == null)
return refreshLeader().thenCompose(res -> run(cmd));
ActionRequest req =
factory.actionRequest().command(cmd).groupId(groupId).readOnlySafe(true).build();
CompletableFuture<ActionResponse> fut = new CompletableFuture<>();
sendWithRetry(leader, req, currentTimeMillis() + timeout, fut);
return fut.thenApply(resp -> (R) resp.result());
}
{code}
Client future usually have some specific generic type, for example
CompletableFuture<Void> that doesn't match an exception, so client future is
completed exceptionally with ClassCastException with the root reason of initial
server side throwable.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)