Kirill Sizov created IGNITE-20492:
--------------------------------------
Summary: 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
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)