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

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

commit 1ac11759e1e37c1e05264961d27d1aaa9a3b58ef
Author: Semyon Danilov <[email protected]>
AuthorDate: Tue Apr 4 21:24:48 2023 +0400

    IGNITE-19220 Prohibit marking NetworkMessage with Marshallable
---
 .../processor/messages/MessageImplGenerator.java   | 12 +++++++++-
 .../processor/TransferableObjectProcessorTest.java | 11 +++++++++
 ...essageWithMarshallableNetworkMessageField.java} | 28 +++++-----------------
 .../ignite/raft/jraft/rpc/ActionRequest.java       |  2 --
 4 files changed, 28 insertions(+), 25 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 84e63cc954..beb830318c 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
@@ -48,6 +48,7 @@ import javax.lang.model.type.TypeMirror;
 import javax.tools.Diagnostic;
 import org.apache.ignite.internal.network.processor.MessageClass;
 import org.apache.ignite.internal.network.processor.MessageGroupWrapper;
+import org.apache.ignite.internal.network.processor.ProcessingException;
 import org.apache.ignite.internal.network.processor.TypeUtils;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
@@ -102,7 +103,8 @@ public class MessageImplGenerator {
 
         // create a field and a getter implementation for every getter in the 
message interface
         for (ExecutableElement getter : getters) {
-            var getterReturnType = TypeName.get(getter.getReturnType());
+            TypeMirror getterType = getter.getReturnType();
+            TypeName getterReturnType = TypeName.get(getterType);
 
             String getterName = getter.getSimpleName().toString();
 
@@ -111,6 +113,14 @@ public class MessageImplGenerator {
                     .addModifiers(Modifier.PRIVATE);
 
             boolean isMarshallable = getter.getAnnotation(Marshallable.class) 
!= null;
+            boolean isMessage = typeUtils.isSubType(getterType, 
NetworkMessage.class);
+
+            if (isMarshallable && isMessage) {
+                String error =
+                        "Failed to process " + message.className() + ": " + 
getterName + " is both NetworkMessage and @Marshallable";
+
+                throw new ProcessingException(error);
+            }
 
             if (!isMarshallable) {
                 fieldBuilder.addModifiers(Modifier.FINAL);
diff --git 
a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
 
b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
index ec119c6ab5..bb7c0346ba 100644
--- 
a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
+++ 
b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
@@ -249,6 +249,17 @@ public class TransferableObjectProcessorTest {
         );
     }
 
+    /**
+     * Tests that compilation fails if message's field is both {@link 
NetworkMessage} and marked
+     * as {@link org.apache.ignite.network.annotations.Marshallable}.
+     */
+    @Test
+    void testFieldBothNetworkMessageAndMarkedMarshallable() {
+        Compilation compilation = 
compile("MessageWithMarshallableNetworkMessageField");
+
+        assertThat(compilation).hadErrorContaining("msgField is both 
NetworkMessage and @Marshallable");
+    }
+
     /**
      * Compiles the given network message.
      */
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
 
b/modules/network/src/test/resources/org/apache/ignite/internal/network/processor/MessageWithMarshallableNetworkMessageField.java
similarity index 62%
copy from 
modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
copy to 
modules/network/src/test/resources/org/apache/ignite/internal/network/processor/MessageWithMarshallableNetworkMessageField.java
index 4781447a2a..07f49676b0 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
+++ 
b/modules/network/src/test/resources/org/apache/ignite/internal/network/processor/MessageWithMarshallableNetworkMessageField.java
@@ -15,31 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.raft.jraft.rpc;
+package org.apache.ignite.internal.network.processor;
 
+import org.apache.ignite.internal.network.message.ScaleCubeMessage;
+import org.apache.ignite.network.NetworkMessage;
 import org.apache.ignite.network.annotations.Marshallable;
 import org.apache.ignite.network.annotations.Transferable;
-import org.apache.ignite.internal.raft.Command;
-import org.apache.ignite.raft.jraft.RaftMessageGroup;
 
-/**
- * Submit an action to a replication group.
- */
-@Transferable(value = RaftMessageGroup.RpcActionMessageGroup.ACTION_REQUEST)
-public interface ActionRequest extends Message {
-    /**
-     * @return Group id.
-     */
-    String groupId();
-
-    /**
-     * @return Action's command.
-     */
+@Transferable(1)
+public interface MessageWithMarshallableNetworkMessageField extends 
NetworkMessage {
     @Marshallable
-    Command command();
-
-    /**
-     * @return {@code True} for linearizable reading.
-     */
-    boolean readOnlySafe();
+    ScaleCubeMessage msgField();
 }
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
 
b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
index 4781447a2a..b88c6be05a 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/ActionRequest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.raft.jraft.rpc;
 
-import org.apache.ignite.network.annotations.Marshallable;
 import org.apache.ignite.network.annotations.Transferable;
 import org.apache.ignite.internal.raft.Command;
 import org.apache.ignite.raft.jraft.RaftMessageGroup;
@@ -35,7 +34,6 @@ public interface ActionRequest extends Message {
     /**
      * @return Action's command.
      */
-    @Marshallable
     Command command();
 
     /**

Reply via email to