This is an automated email from the ASF dual-hosted git repository.

sanpwc pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 6d9123eb6e IGNITE-23229 Fixed 
StopLeaseProlongationMessageResponse#deniedLeaseExpirationTime may unbox a null 
value and cause NPE (#4425)
6d9123eb6e is described below

commit 6d9123eb6e683852c16e057c71e2fb353f3334a0
Author: Denis Chudov <[email protected]>
AuthorDate: Thu Sep 19 19:34:07 2024 +0300

    IGNITE-23229 Fixed 
StopLeaseProlongationMessageResponse#deniedLeaseExpirationTime may unbox a null 
value and cause NPE (#4425)
---
 .../message/StopLeaseProlongationMessageResponse.java    |  3 +--
 .../ignite/internal/placementdriver/LeaseUpdater.java    |  5 ++++-
 .../ignite/internal/replicator/ReplicaManager.java       | 16 ++++++++++------
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git 
a/modules/placement-driver-api/src/main/java/org/apache/ignite/internal/placementdriver/message/StopLeaseProlongationMessageResponse.java
 
b/modules/placement-driver-api/src/main/java/org/apache/ignite/internal/placementdriver/message/StopLeaseProlongationMessageResponse.java
index a1aa8eece1..90a3b4445e 100644
--- 
a/modules/placement-driver-api/src/main/java/org/apache/ignite/internal/placementdriver/message/StopLeaseProlongationMessageResponse.java
+++ 
b/modules/placement-driver-api/src/main/java/org/apache/ignite/internal/placementdriver/message/StopLeaseProlongationMessageResponse.java
@@ -33,8 +33,7 @@ public interface StopLeaseProlongationMessageResponse extends 
PlacementDriverMes
      *
      * @return Lease expiration time of denied lease.
      */
-    @Nullable
-    Long deniedLeaseExpirationTimeLong();
+    long deniedLeaseExpirationTimeLong();
 
     @Nullable
     default HybridTimestamp deniedLeaseExpirationTime() {
diff --git 
a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/LeaseUpdater.java
 
b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/LeaseUpdater.java
index 1c76765a9c..ef26725948 100644
--- 
a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/LeaseUpdater.java
+++ 
b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/LeaseUpdater.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.placementdriver;
 
 import static java.util.Objects.hash;
 import static java.util.Objects.requireNonNullElse;
+import static 
org.apache.ignite.internal.hlc.HybridTimestamp.NULL_HYBRID_TIMESTAMP;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.notExists;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.or;
@@ -733,7 +734,9 @@ public class LeaseUpdater {
                         }
 
                         if (correlationId != null) {
-                            Long deniedLeaseExpTimeLong = deniedLeaseExpTime 
== null ? null : deniedLeaseExpTime.longValue();
+                            long deniedLeaseExpTimeLong = deniedLeaseExpTime 
== null
+                                    ? NULL_HYBRID_TIMESTAMP
+                                    : deniedLeaseExpTime.longValue();
 
                             StopLeaseProlongationMessageResponse response = 
PLACEMENT_DRIVER_MESSAGES_FACTORY
                                     .stopLeaseProlongationMessageResponse()
diff --git 
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaManager.java
 
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaManager.java
index d69add472a..472fd34ecf 100644
--- 
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaManager.java
+++ 
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaManager.java
@@ -45,7 +45,6 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
@@ -605,21 +604,26 @@ public class ReplicaManager extends 
AbstractEventProducer<LocalReplicaEvent, Loc
                     }
                 }
 
+                // We send StopLeaseProlongationMessage on every node of 
placement driver group, so there should be all nulls or
+                // just one non-null, possible outcomes:
+                // - it wasn't successfully handled anywhere (lease updater 
thread made successful ms.invoke, and SLPM handlers failed
+                //   to do ms.invoke)
+                // - it was successfully handled on one node of PD group, in 
this case we get one non-null
+                // - it was successfully handled on some node, but message 
handling was delayed on some other node and it already got lease
+                //   update from MS where this lease was denied, in this case 
it also returns null (slightly other case than
+                //   failed ms.invoke but same outcome)
                 return allOf(futs)
                         .thenCompose(unused -> {
                             NetworkMessage response = futs.stream()
                                     .map(CompletableFuture::join)
-                                    .filter(Objects::nonNull)
+                                    .filter(resp -> resp instanceof 
StopLeaseProlongationMessageResponse
+                                            && 
((StopLeaseProlongationMessageResponse) resp).deniedLeaseExpirationTime() != 
null)
                                     .findAny()
                                     .orElse(null);
 
                             if (response == null) {
                                 return stopLeaseProlongation(groupId, 
redirectNodeId, endTime);
                             } else {
-                                assert response instanceof 
StopLeaseProlongationMessageResponse : format(
-                                        "Unexpected response type [class={}, "
-                                                + "response={}].", 
response.getClass(), response);
-
                                 return 
completedFuture(((StopLeaseProlongationMessageResponse) 
response).deniedLeaseExpirationTime());
                             }
                         });

Reply via email to