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

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-fury.git


The following commit(s) were added to refs/heads/main by this push:
     new 7d912ca1 fix(java): clear serializer for collection/map (#1606)
7d912ca1 is described below

commit 7d912ca161d7e8f75176ce4d25fdcf2aac61a74a
Author: Shawn Yang <[email protected]>
AuthorDate: Mon May 6 22:54:33 2024 +0800

    fix(java): clear serializer for collection/map (#1606)
    
    ## What does this PR do?
    Some collectionSerializer may overwrite write/read method, then clear
    element serializer may not got invoked.
    
    This PR clears serializer for collection/map to avoid container use
    wrong serializer for nested elements.
    
    ## Related issues
    
    #1558
    https://github.com/apache/incubator-fury/issues/1455,
    https://github.com/apache/incubator-fury/issues/1325 and
    https://github.com/apache/incubator-fury/issues/1176.
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/incubator-fury/issues/new/choose)
    describing the need to do so and update the document if necessary.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    
    ## Benchmark
    
    <!--
    When the PR has an impact on performance (if you don't know whether the
    PR will have an impact on performance, you can submit the PR first, and
    if it will have impact on performance, the code reviewer will explain
    it), be sure to attach a benchmark data here.
    -->
---
 .../org/apache/fury/resolver/FieldResolver.java    | 91 +++++++++++++++++-----
 .../fury/serializer/CompatibleSerializer.java      | 43 +++++++---
 2 files changed, 107 insertions(+), 27 deletions(-)

diff --git 
a/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java 
b/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
index b7651179..047a2af1 100644
--- a/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
+++ b/java/fury-core/src/main/java/org/apache/fury/resolver/FieldResolver.java
@@ -568,29 +568,54 @@ public class FieldResolver {
       ClassInfo elementClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       CollectionSerializer collectionSerializer = (CollectionSerializer) 
classInfo.getSerializer();
-      
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
-      o = collectionSerializer.read(buffer);
+      try {
+        
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
+        o = collectionSerializer.read(buffer);
+      } finally {
+        // Some collectionSerializer may overwrite write/read method, then 
clear element serializer
+        // may not got invoked.
+        collectionSerializer.setElementSerializer(null);
+      }
     } else if (fieldType == FieldTypes.MAP_KV_FINAL) {
       ClassInfo keyClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo valueClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-      mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
-      mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
-      o = mapSerializer.read(buffer);
+      try {
+        mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+        mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+        o = mapSerializer.read(buffer);
+      } finally {
+        // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+        // may not got invoked.
+        mapSerializer.setKeySerializer(null);
+        mapSerializer.setValueSerializer(null);
+      }
     } else if (fieldType == FieldTypes.MAP_KEY_FINAL) {
       ClassInfo keyClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-      mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
-      o = mapSerializer.read(buffer);
+      try {
+        mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+        o = mapSerializer.read(buffer);
+      } finally {
+        // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+        // may not got invoked.
+        mapSerializer.setKeySerializer(null);
+      }
     } else {
       Preconditions.checkArgument(fieldType == FieldTypes.MAP_VALUE_FINAL);
       ClassInfo valueClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-      mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
-      o = mapSerializer.read(buffer);
+      try {
+        mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+        o = mapSerializer.read(buffer);
+      } finally {
+        // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+        // may not got invoked.
+        mapSerializer.setValueSerializer(null);
+      }
     }
     return o;
   }
@@ -601,29 +626,54 @@ public class FieldResolver {
       ClassInfo elementClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
fieldInfo.getClassInfoHolder());
       CollectionSerializer collectionSerializer = (CollectionSerializer) 
classInfo.getSerializer();
-      
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
-      o = collectionSerializer.read(buffer);
+      try {
+        
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
+        o = collectionSerializer.read(buffer);
+        // Some collectionSerializer may overwrite write/read method, then 
clear element serializer
+        // may not got invoked.
+      } finally {
+        collectionSerializer.setElementSerializer(null);
+      }
     } else if (fieldType == FieldTypes.MAP_KV_FINAL) {
       ClassInfo keyClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo valueClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
fieldInfo.getClassInfoHolder());
       MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-      mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
-      mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
-      o = mapSerializer.read(buffer);
+      try {
+        mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+        mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+        o = mapSerializer.read(buffer);
+      } finally {
+        // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+        // may not got invoked.
+        mapSerializer.setKeySerializer(null);
+        mapSerializer.setValueSerializer(null);
+      }
     } else if (fieldType == FieldTypes.MAP_KEY_FINAL) {
       ClassInfo keyClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
fieldInfo.getClassInfoHolder());
       MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-      mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
-      o = mapSerializer.read(buffer);
+      try {
+        mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+        o = mapSerializer.read(buffer);
+        // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+        // may not got invoked.
+      } finally {
+        mapSerializer.setKeySerializer(null);
+      }
     } else {
       Preconditions.checkArgument(fieldType == FieldTypes.MAP_VALUE_FINAL);
       ClassInfo valueClassInfo = classResolver.readClassInfo(buffer, 
classInfoHolder);
       ClassInfo classInfo = classResolver.readClassInfo(buffer, 
fieldInfo.getClassInfoHolder());
       MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-      mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
-      o = mapSerializer.read(buffer);
+      try {
+        mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+        o = mapSerializer.read(buffer);
+        // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+        // may not got invoked.
+      } finally {
+        mapSerializer.setValueSerializer(null);
+      }
     }
     return o;
   }
@@ -969,4 +1019,9 @@ public class FieldResolver {
       return valueType;
     }
   }
+
+  public static void main(String[] args) {
+    System.out.println(computeStringHash("list0") << 2);
+    System.out.println(computeStringHash("serializeListLast") << 2);
+  }
 }
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
 
b/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
index c143ce2e..b48e8993 100644
--- 
a/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
+++ 
b/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
@@ -242,8 +242,14 @@ public final class CompatibleSerializer<T> extends 
CompatibleSerializerBase<T> {
     ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
     classResolver.writeClass(buffer, classInfo);
     CollectionSerializer collectionSerializer = (CollectionSerializer) 
classInfo.getSerializer();
-    
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
-    collectionSerializer.write(buffer, fieldValue);
+    try {
+      
collectionSerializer.setElementSerializer(elementClassInfo.getSerializer());
+      collectionSerializer.write(buffer, fieldValue);
+    } finally {
+      // Some collectionSerializer may overwrite write/read method, then clear 
element serializer
+      // may not got invoked.
+      collectionSerializer.setElementSerializer(null);
+    }
   }
 
   private void writeMapKVFinal(
@@ -256,9 +262,16 @@ public final class CompatibleSerializer<T> extends 
CompatibleSerializerBase<T> {
     ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
     classResolver.writeClass(buffer, classInfo);
     MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-    mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
-    mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
-    mapSerializer.write(buffer, fieldValue);
+    try {
+      mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+      mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+      mapSerializer.write(buffer, fieldValue);
+    } finally {
+      // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+      // may not got invoked.
+      mapSerializer.setKeySerializer(null);
+      mapSerializer.setValueSerializer(null);
+    }
   }
 
   private void writeMapKeyFinal(
@@ -269,8 +282,14 @@ public final class CompatibleSerializer<T> extends 
CompatibleSerializerBase<T> {
     ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
     classResolver.writeClass(buffer, classInfo);
     MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-    mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
-    mapSerializer.write(buffer, fieldValue);
+    try {
+      mapSerializer.setKeySerializer(keyClassInfo.getSerializer());
+      mapSerializer.write(buffer, fieldValue);
+    } finally {
+      // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+      // may not got invoked.
+      mapSerializer.setKeySerializer(null);
+    }
   }
 
   private void writeMapValueFinal(
@@ -281,8 +300,14 @@ public final class CompatibleSerializer<T> extends 
CompatibleSerializerBase<T> {
     ClassInfo classInfo = fieldInfo.getClassInfo(fieldValue.getClass());
     classResolver.writeClass(buffer, classInfo);
     MapSerializer mapSerializer = (MapSerializer) classInfo.getSerializer();
-    mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
-    mapSerializer.write(buffer, fieldValue);
+    try {
+      mapSerializer.setValueSerializer(valueClassInfo.getSerializer());
+      mapSerializer.write(buffer, fieldValue);
+    } finally {
+      // Some mmapSerializer may overwrite write/read method, then clear 
serializer
+      // may not got invoked.
+      mapSerializer.setValueSerializer(null);
+    }
   }
 
   @SuppressWarnings("unchecked")


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to