[
https://issues.apache.org/jira/browse/IGNITE-20492?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Vyacheslav Koptilin updated IGNITE-20492:
-----------------------------------------
Priority: Blocker (was: Major)
> NPE in PartitionReplicaListener's primary replica retrieval
> -----------------------------------------------------------
>
> Key: IGNITE-20492
> URL: https://issues.apache.org/jira/browse/IGNITE-20492
> Project: Ignite
> Issue Type: Bug
> Reporter: Kirill Sizov
> Priority: Blocker
> Labels: ignite-3
>
> PartitionReplicaListener.ensureReplicaIsPrimary has the following block of
> code
> {code:java}
> if (expectedTerm != null) {
> return placementDriver.getPrimaryReplica(replicationGroupId, now)
> .thenCompose(primaryReplica -> {
> long currentEnlistmentConsistencyToken =
> primaryReplica.getStartTime().longValue();
> {code}
> However, according to the placementDriver's contract, {{getPrimaryReplica}}
> can complete with null:
> {quote}
> Same as awaitPrimaryReplica(ReplicationGroupId, HybridTimestamp) despite the
> fact that given method await logic is bounded. It will wait for a primary
> replica for a reasonable period of time, and complete a future with null if a
> matching lease isn't found. Generally speaking reasonable here means enough
> for distribution across cluster nodes.
> {quote}
> In that case ensureReplicaIsPrimary will crash with NPE:
> {noformat}
> ... 3 more
> Caused by: java.lang.NullPointerException
> at
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.lambda$ensureReplicaIsPrimary$155(PartitionReplicaListener.java:2397)
> ~[ignite-table-3.0.0-SNAPSHOT.jar:?]
> at
> java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
> ~[?:?]
> at
> java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
> ~[?:?]
> at
> java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
> ~[?:?]
> at
> org.apache.ignite.internal.util.PendingComparableValuesTracker.lambda$completeWaitersOnUpdate$0(PendingComparableValuesTracker.java:169)
> ~[ignite-core-3.0.0-SNAPSHOT.jar:?]
> at java.util.concurrent.ConcurrentMap.forEach(ConcurrentMap.java:122) ~[?:?]
> at
> org.apache.ignite.internal.util.PendingComparableValuesTracker.completeWaitersOnUpdate(PendingComparableValuesTracker.java:169)
> ~[ignite-core-3.0.0-SNAPSHOT.jar:?]
> at
> org.apache.ignite.internal.util.PendingComparableValuesTracker.update(PendingComparableValuesTracker.java:103)
> ~[ignite-core-3.0.0-SNAPSHOT.jar:?]
> at
> org.apache.ignite.internal.metastorage.server.time.ClusterTimeImpl.updateSafeTime(ClusterTimeImpl.java:146)
> ~[ignite-metastorage-3.0.0-SNAPSHOT.jar:?]
> at
> org.apache.ignite.internal.metastorage.impl.MetaStorageManagerImpl.onSafeTimeAdvanced(MetaStorageManagerImpl.java:849)
> ~[ignite-metastorage-3.0.0-SNAPSHOT.jar:?]
> at
> org.apache.ignite.internal.metastorage.impl.MetaStorageManagerImpl$1.onSafeTimeAdvanced(MetaStorageManagerImpl.java:456)
> ~[ignite-metastorage-3.0.0-SNAPSHOT.jar:?]
> at
> org.apache.ignite.internal.metastorage.server.WatchProcessor.invokeOnRevisionCallback(WatchProcessor.java:247)
> ~[ignite-metastorage-3.0.0-SNAPSHOT.jar:?]
> at
> org.apache.ignite.internal.metastorage.server.WatchProcessor.lambda$notifyWatches$2(WatchProcessor.java:148)
> ~[ignite-metastorage-3.0.0-SNAPSHOT.jar:?]
> at
> java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
> ~[?:?]
> at
> java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
> ~[?:?]
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)