[ 
https://issues.apache.org/jira/browse/IGNITE-24423?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kirill Tkalenko updated IGNITE-24423:
-------------------------------------
    Reviewer: Kirill Tkalenko

> Potential NullPointerException if we failed to retrieve primary replica
> -----------------------------------------------------------------------
>
>                 Key: IGNITE-24423
>                 URL: https://issues.apache.org/jira/browse/IGNITE-24423
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Ivan Zlenko
>            Assignee: Ivan Zlenko
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 1h
>  Remaining Estimate: 0h
>
> In case we received empty response with no exception while for primary 
> replica in InternalTableImpl class we will fail with NullPoinerException:
> {code:java}
>     protected CompletableFuture<ClusterNode> 
> evaluateReadOnlyRecipientNode(int partId, @Nullable HybridTimestamp 
> readTimestamp) {
>         TablePartitionId tablePartitionId = new TablePartitionId(tableId, 
> partId);
>         return awaitPrimaryReplica(tablePartitionId, readTimestamp)
>                 .handle((res, e) -> {
>                     if (e != null) {
>                         throw withCause(TransactionException::new, 
> REPLICA_UNAVAILABLE_ERR, e);
>                     } else {
>                         if (res == null) {
>                             throw withCause(TransactionException::new, 
> REPLICA_UNAVAILABLE_ERR, e);
>                         } else {
>                             return getClusterNode(res);
>                         }
>                     }
>                 });
>     }
> {code}
> {code:java}
>     public static <T extends Exception> T withCause(IgniteTriFunction<UUID, 
> Integer, Throwable, T> supplier, int defaultCode, Throwable t) {
>         return withCauseInternal((traceId, code, message, cause) -> 
> supplier.apply(traceId, code, t), defaultCode, t);
>     }
>     private static <T extends Exception> T withCauseInternal(
>             IgniteQuadFunction<UUID, Integer, String, Throwable, T> supplier,
>             int defaultCode,
>             Throwable t
>     ) {
>         Throwable unwrapped = unwrapCause(t);
>         if (unwrapped instanceof TraceableException) {
>             TraceableException traceable = (TraceableException) unwrapped;
>             return supplier.apply(traceable.traceId(), traceable.code(), 
> unwrapped.getMessage(), t);
>         }
>         return supplier.apply(UUID.randomUUID(), defaultCode, t.getMessage(), 
> t);
>     }
> {code}



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

Reply via email to