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 <lapin1...@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); }