You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sa...@apache.org on 2023/12/15 16:24:22 UTC

(ignite-3) branch main updated: IGNITE-21062 Fix safe time reordering in partitions. (#2958)

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 eaadc2c921 IGNITE-21062 Fix safe time reordering in partitions. (#2958)
eaadc2c921 is described below

commit eaadc2c92106496ef91a8405f68e0a03373dec13
Author: Alexander Lapin <la...@gmail.com>
AuthorDate: Fri Dec 15 18:24:16 2023 +0200

    IGNITE-21062 Fix safe time reordering in partitions. (#2958)
---
 .../processor/messages/MessageImplGenerator.java      | 19 +++++++++++++++++++
 .../org/apache/ignite/network/NetworkMessage.java     |  7 ++++++-
 .../MessageSerializationRegistryImplTest.java         |  5 +++++
 .../replicator/PartitionReplicaListener.java          |  6 ++++--
 4 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
index 091b9c3489..78adcb38ad 100644
--- a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
@@ -187,6 +187,7 @@ public class MessageImplGenerator {
         TypeSpec.Builder messageImpl = TypeSpec.classBuilder(messageImplClassName)
                 .addModifiers(Modifier.PUBLIC)
                 .addSuperinterface(message.className())
+                .addSuperinterface(Cloneable.class)
                 .addFields(fields)
                 .addMethods(methodImpls)
                 .addMethod(constructor(fields, notNullFieldNames, marshallableFieldNames));
@@ -238,6 +239,24 @@ public class MessageImplGenerator {
         // equals and hashCode
         generateEqualsAndHashCode(messageImpl, message);
 
+        // generate clone
+        MethodSpec cloneMethod = MethodSpec.methodBuilder("clone")
+                .addAnnotation(Override.class)
+                .addModifiers(Modifier.PUBLIC)
+                .returns(messageImplClassName)
+                .addCode(CodeBlock.builder()
+                        .beginControlFlow("try")
+                        .addStatement("return ($T) super.clone()", messageImplClassName)
+                        .endControlFlow()
+                        .beginControlFlow("catch (CloneNotSupportedException e)")
+                        .addStatement("// Never expected to be thrown because whole message class hierarchy implements clone()")
+                        .addStatement("throw new AssertionError(e)")
+                        .endControlFlow()
+                        .build())
+                .build();
+
+        messageImpl.addMethod(cloneMethod);
+
         var builderName = ClassName.get(message.packageName(), builderInterface.name);
 
         // nested builder interface and static factory method
diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/NetworkMessage.java b/modules/network-api/src/main/java/org/apache/ignite/network/NetworkMessage.java
index c405190ef3..404a59aa39 100644
--- a/modules/network-api/src/main/java/org/apache/ignite/network/NetworkMessage.java
+++ b/modules/network-api/src/main/java/org/apache/ignite/network/NetworkMessage.java
@@ -22,7 +22,7 @@ import it.unimi.dsi.fastutil.ints.IntSet;
 /**
  * Message for exchanging information in a cluster.
  */
-public interface NetworkMessage {
+public interface NetworkMessage extends Cloneable {
     /** Group type for the {@code null} message. */
     short NULL_GROUP_TYPE = -1;
 
@@ -60,4 +60,9 @@ public interface NetworkMessage {
     default boolean needAck() {
         return true;
     }
+
+    /**
+     * Public clone version that is implemented in generated *Impl class.
+     */
+    NetworkMessage clone();
 }
diff --git a/modules/network/src/test/java/org/apache/ignite/network/serialization/MessageSerializationRegistryImplTest.java b/modules/network/src/test/java/org/apache/ignite/network/serialization/MessageSerializationRegistryImplTest.java
index 21db839e6e..9b4aa81401 100644
--- a/modules/network/src/test/java/org/apache/ignite/network/serialization/MessageSerializationRegistryImplTest.java
+++ b/modules/network/src/test/java/org/apache/ignite/network/serialization/MessageSerializationRegistryImplTest.java
@@ -138,6 +138,11 @@ public class MessageSerializationRegistryImplTest extends BaseIgniteAbstractTest
         public short groupType() {
             return GROUP_TYPE;
         }
+
+        @Override
+        public Msg clone() {
+            throw new UnsupportedOperationException();
+        }
     }
 
     /**
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java
index 7c0be5ba65..a7b06067ec 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java
@@ -2492,9 +2492,11 @@ public class PartitionReplicaListener implements ReplicaListener {
                         }
                     }
 
-                    safeTimePropagatingCommand.safeTimeLong(safeTimeForRetry.longValue());
+                    SafeTimePropagatingCommand clonedSafeTimePropagatingCommand =
+                            (SafeTimePropagatingCommand) safeTimePropagatingCommand.clone();
+                    clonedSafeTimePropagatingCommand.safeTimeLong(safeTimeForRetry.longValue());
 
-                    applyCmdWithRetryOnSafeTimeReorderException(safeTimePropagatingCommand, resultFuture);
+                    applyCmdWithRetryOnSafeTimeReorderException(clonedSafeTimePropagatingCommand, resultFuture);
                 } else {
                     resultFuture.completeExceptionally(ex);
                 }