Skip to content

Commit

Permalink
fix(java): clear serializer for collection/map (#1606)
Browse files Browse the repository at this point in the history
## 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
#1455,
#1325 and
#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.
-->
  • Loading branch information
chaokunyang committed May 6, 2024
1 parent 501c1dc commit 7d912ca
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -568,29 +568,54 @@ private Object readObjectWithFinal(MemoryBuffer buffer, byte fieldType) {
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;
}
Expand All @@ -601,29 +626,54 @@ private Object readObjectWithFinal(MemoryBuffer buffer, byte fieldType, FieldInf
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;
}
Expand Down Expand Up @@ -969,4 +1019,9 @@ public Class<?> getValueType() {
return valueType;
}
}

public static void main(String[] args) {
System.out.println(computeStringHash("list0") << 2);
System.out.println(computeStringHash("serializeListLast") << 2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,14 @@ private void writeCollectionField(
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(
Expand All @@ -256,9 +262,16 @@ private void writeMapKVFinal(
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(
Expand All @@ -269,8 +282,14 @@ private void writeMapKeyFinal(
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(
Expand All @@ -281,8 +300,14 @@ private void writeMapValueFinal(
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")
Expand Down

0 comments on commit 7d912ca

Please sign in to comment.