[
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)