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);
}