From ab60c5eb5956a7ea21101ea4519b8a893800054e Mon Sep 17 00:00:00 2001 From: Xiang Wei Date: Sun, 26 Dec 2021 11:09:50 +0800 Subject: [PATCH] [fix](spark-load) fix Roaring64Map big-endian read/write in de/serialization (#7480) See #7479 This bug is triggered when the bitmap exceeds 32 bits. --- .../main/java/org/apache/doris/common/io/Roaring64Map.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/io/Roaring64Map.java b/fe/fe-common/src/main/java/org/apache/doris/common/io/Roaring64Map.java index 5a2013892c..bf35f5a2e4 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/io/Roaring64Map.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/io/Roaring64Map.java @@ -1322,7 +1322,8 @@ public class Roaring64Map { Codec.encodeVarint64(highToBitmap.size(), out); for (Map.Entry entry : highToBitmap.entrySet()) { - out.writeInt(entry.getKey().intValue()); + // serialized in little end for BE cpp read in case of bugs when the value is larger than 32bits + out.writeInt(Integer.reverseBytes(entry.getKey().intValue())); entry.getValue().serialize(out); } } @@ -1356,7 +1357,8 @@ public class Roaring64Map { long nbHighs = Codec.decodeVarint64(in); for (int i = 0; i < nbHighs; i++) { - int high = in.readInt(); + // keep the same behavior with little-end serialize + int high = Integer.reverseBytes(in.readInt()); RoaringBitmap provider = new RoaringBitmap(); provider.deserialize(in); highToBitmap.put(high, provider);