positions) throws IOException {
+ Roaring64NavigableMap positionBitmap = new Roaring64NavigableMap();
+ positions.forEach(positionBitmap::add);
+ return encodePositions(positionBitmap);
+ }
+
+ /**
+ * Encodes the {@link Roaring64NavigableMap} bitmap containing the record positions.
+ *
+ * The encoding applies the Base64 codec ({@link java.util.Base64} in Java implementation) on
+ * the bytes generated from serializing {@link Roaring64NavigableMap} bitmap using the portable
+ * format.
+ *
+ * @param positionBitmap {@link Roaring64NavigableMap} bitmap containing the record positions.
+ * @return A string of Base64-encoded bytes ({@link java.util.Base64} in Java implementation)
+ * generated from serializing {@link Roaring64NavigableMap} bitmap using the portable format.
+ * @throws IOException upon I/O error.
+ */
+ public static String encodePositions(Roaring64NavigableMap positionBitmap) throws IOException {
+ positionBitmap.runOptimize();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(baos);
+ positionBitmap.serializePortable(dos);
+ return Base64CodecUtil.encode(baos.toByteArray());
+ }
+
+ /**
+ * Decodes the {@link HeaderMetadataType#RECORD_POSITIONS} block header into record positions.
+ *
+ * @param content A string of Base64-encoded bytes ({@link java.util.Base64} in Java
+ * implementation) generated from serializing {@link Roaring64NavigableMap}
+ * bitmap using the portable format.
+ * @return A {@link Roaring64NavigableMap} bitmap containing the record positions in long type.
+ * @throws IOException upon I/O error.
+ */
+ public static Roaring64NavigableMap decodeRecordPositionsHeader(String content) throws IOException {
+ Roaring64NavigableMap positionBitmap = new Roaring64NavigableMap();
+ ByteArrayInputStream bais = new ByteArrayInputStream(Base64CodecUtil.decode(content));
+ DataInputStream dis = new DataInputStream(bais);
+ positionBitmap.deserializePortable(dis);
+ return positionBitmap;
+ }
}
diff --git a/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieLogBlock.java b/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieLogBlock.java
index 84142d768006f..3ac161cbe1c71 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieLogBlock.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieLogBlock.java
@@ -20,6 +20,7 @@
import org.apache.hudi.common.model.HoodieLogFile;
import org.apache.hudi.common.table.log.HoodieMergedLogRecordScanner;
+import org.apache.hudi.common.table.log.LogReaderUtils;
import org.apache.hudi.common.util.Option;
import org.apache.hudi.common.util.TypeUtils;
import org.apache.hudi.exception.HoodieException;
@@ -27,6 +28,7 @@
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
+import org.roaringbitmap.longlong.Roaring64NavigableMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -122,6 +124,19 @@ public boolean isCompactedLogBlock() {
return logBlockHeader.containsKey(HeaderMetadataType.COMPACTED_BLOCK_TIMES);
}
+ /**
+ * @return A {@link Roaring64NavigableMap} bitmap containing the record positions in long type
+ * if the {@link HeaderMetadataType#RECORD_POSITIONS} block header exists; otherwise, an empty
+ * {@link Roaring64NavigableMap} bitmap.
+ * @throws IOException upon I/O error.
+ */
+ public Roaring64NavigableMap getRecordPositions() throws IOException {
+ if (!logBlockHeader.containsKey(HeaderMetadataType.RECORD_POSITIONS)) {
+ return new Roaring64NavigableMap();
+ }
+ return LogReaderUtils.decodeRecordPositionsHeader(logBlockHeader.get(HeaderMetadataType.RECORD_POSITIONS));
+ }
+
/**
* Type of the log block WARNING: This enum is serialized as the ordinal. Only add new enums at the end.
*/
@@ -153,7 +168,7 @@ public static HoodieLogBlockType fromId(String id) {
* new enums at the end.
*/
public enum HeaderMetadataType {
- INSTANT_TIME, TARGET_INSTANT_TIME, SCHEMA, COMMAND_BLOCK_TYPE, COMPACTED_BLOCK_TIMES
+ INSTANT_TIME, TARGET_INSTANT_TIME, SCHEMA, COMMAND_BLOCK_TYPE, COMPACTED_BLOCK_TIMES, RECORD_POSITIONS
}
/**
diff --git a/hudi-common/src/test/java/org/apache/hudi/common/functional/TestHoodieLogFormat.java b/hudi-common/src/test/java/org/apache/hudi/common/functional/TestHoodieLogFormat.java
index 2931fc0eea6d8..9da97a0733367 100755
--- a/hudi-common/src/test/java/org/apache/hudi/common/functional/TestHoodieLogFormat.java
+++ b/hudi-common/src/test/java/org/apache/hudi/common/functional/TestHoodieLogFormat.java
@@ -38,6 +38,8 @@
import org.apache.hudi.common.table.log.HoodieLogFormat.Reader;
import org.apache.hudi.common.table.log.HoodieLogFormat.Writer;
import org.apache.hudi.common.table.log.HoodieMergedLogRecordScanner;
+import org.apache.hudi.common.table.log.LogReaderUtils;
+import org.apache.hudi.common.table.log.TestLogReaderUtils;
import org.apache.hudi.common.table.log.block.HoodieAvroDataBlock;
import org.apache.hudi.common.table.log.block.HoodieCDCDataBlock;
import org.apache.hudi.common.table.log.block.HoodieCommandBlock;
@@ -2693,13 +2695,29 @@ public void testDataBlockFormatAppendAndReadWithProjectedSchema(
}
}
+ @ParameterizedTest
+ @ValueSource(booleans = {false, true})
+ public void testGetRecordPositions(boolean addRecordPositionsHeader) throws IOException {
+ Map header = new HashMap<>();
+ List positions = new ArrayList<>();
+ if (addRecordPositionsHeader) {
+ positions = TestLogReaderUtils.generatePositions();
+ String content = LogReaderUtils.encodePositions(positions);
+ header.put(HeaderMetadataType.RECORD_POSITIONS, content);
+ }
+ HoodieLogBlock logBlock = new HoodieDeleteBlock(new DeleteRecord[0], header);
+ if (addRecordPositionsHeader) {
+ TestLogReaderUtils.assertPositionEquals(positions, logBlock.getRecordPositions());
+ }
+ }
+
private static HoodieDataBlock getDataBlock(HoodieLogBlockType dataBlockType, List records,
- Map header) {
+ Map header) {
return getDataBlock(dataBlockType, records.stream().map(HoodieAvroIndexedRecord::new).collect(Collectors.toList()), header, new Path("dummy_path"));
}
private static HoodieDataBlock getDataBlock(HoodieLogBlockType dataBlockType, List records,
- Map header, Path pathForReader) {
+ Map header, Path pathForReader) {
switch (dataBlockType) {
case CDC_DATA_BLOCK:
return new HoodieCDCDataBlock(records, header, HoodieRecord.RECORD_KEY_METADATA_FIELD);
diff --git a/hudi-common/src/test/java/org/apache/hudi/common/table/log/TestLogReaderUtils.java b/hudi-common/src/test/java/org/apache/hudi/common/table/log/TestLogReaderUtils.java
new file mode 100644
index 0000000000000..69b1bddc5cfec
--- /dev/null
+++ b/hudi-common/src/test/java/org/apache/hudi/common/table/log/TestLogReaderUtils.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hudi.common.table.log;
+
+import org.apache.hudi.common.util.FileIOUtils;
+
+import org.junit.jupiter.api.Test;
+import org.roaringbitmap.longlong.Roaring64NavigableMap;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+/**
+ * Tests for {@link LogReaderUtils}
+ */
+public class TestLogReaderUtils {
+ @Test
+ public void testEncodeAndDecodePositions() throws IOException {
+ List positions = generatePositions();
+ String content = LogReaderUtils.encodePositions(positions);
+ Roaring64NavigableMap roaring64NavigableMap = LogReaderUtils.decodeRecordPositionsHeader(content);
+ assertPositionEquals(positions, roaring64NavigableMap);
+ }
+
+ @Test
+ public void testEncodeBitmapAndDecodePositions() throws IOException {
+ Roaring64NavigableMap positionBitmap = new Roaring64NavigableMap();
+ List positions = generatePositions();
+ positions.forEach(positionBitmap::add);
+ String content = LogReaderUtils.encodePositions(positionBitmap);
+ Roaring64NavigableMap roaring64NavigableMap = LogReaderUtils.decodeRecordPositionsHeader(content);
+ assertPositionEquals(positions, roaring64NavigableMap);
+ }
+
+ @Test
+ public void testCompatibilityOfDecodingPositions() throws IOException {
+ List expectedPositions = Arrays.stream(
+ readLastLineFromResourceFile("/format/expected_record_positions.data").split(","))
+ .map(Long::parseLong).collect(Collectors.toList());
+ String content = readLastLineFromResourceFile("/format/record_positions_header_v3.data");
+ Roaring64NavigableMap roaring64NavigableMap = LogReaderUtils.decodeRecordPositionsHeader(content);
+ assertPositionEquals(expectedPositions, roaring64NavigableMap);
+ }
+
+ public static List generatePositions() {
+ Random random = new Random(0x2023);
+ Set positions = new HashSet<>();
+ while (positions.size() < 1000) {
+ long pos = Math.abs(random.nextLong() % 1_000_000_000_000L);
+ positions.add(pos);
+ }
+ return new ArrayList<>(positions);
+ }
+
+ public static void assertPositionEquals(List expectedPositions,
+ Roaring64NavigableMap roaring64NavigableMap) {
+ List sortedExpectedPositions =
+ expectedPositions.stream().sorted().collect(Collectors.toList());
+ Iterator expectedIterator = sortedExpectedPositions.iterator();
+ Iterator iterator = roaring64NavigableMap.iterator();
+ while (expectedIterator.hasNext() && iterator.hasNext()) {
+ assertEquals(expectedIterator.next(), iterator.next());
+ }
+ assertFalse(expectedIterator.hasNext());
+ assertFalse(iterator.hasNext());
+ }
+
+ private String readLastLineFromResourceFile(String resourceName) throws IOException {
+ try (InputStream inputStream = TestLogReaderUtils.class.getResourceAsStream(resourceName)) {
+ List lines = FileIOUtils.readAsUTFStringLines(inputStream);
+ return lines.get(lines.size() - 1);
+ }
+ }
+}
diff --git a/hudi-common/src/test/resources/format/expected_record_positions.data b/hudi-common/src/test/resources/format/expected_record_positions.data
new file mode 100644
index 0000000000000..62333bfb435ea
--- /dev/null
+++ b/hudi-common/src/test/resources/format/expected_record_positions.data
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+423133750494,113789179463,780334008121,911098048893,475696966102,801530080858,615214040350,505117186861,934667970116,712398124680,134451922431,515848112785,833896806599,508917585335,245383832097,1922597509,206062686843,90094875174,585480954314,754073998045,993730356788,432324589770,481543239267,196800965195,549739204442,684667679207,43650058653,527028958478,806169521125,856581249234,607029040483,17019477597,103090964634,563231341446,899212187097,628204897102,508359005388,574673362318,960046665688,741745859567,309453200557,656535311401,932517633784,10061426678,469070665445,171869283423,504928446501,32604055317,428263960237,471448728746,869829600632,674569959244,472628851424,40821483900,974852485387,935333936828,929073437076,343396584486,502069489082,33349995443,979097871939,155774651562,412838878992,725471437233,191807375583,995915071906,16450292977,947460723108,524355773960,464761400804,713813422661,376304127314,548604500834,232544371726,797205617945,951651560076,589205909357,940329902160,983094668651,503540137391,424553906574,764028988301,524845077471,644628735705,328797093133,811554432064,193440989505,666144708946,306021902475,344171670219,187449439314,855023117112,875697773510,862488205365,528350483695,67697046448,271587425117,626098374257,726913541893,951021526355,763705427990,913551168503,698601918336,586632273476,397639763390,916018771683,701524233832,320527587441,273157360027,810369068446,311513347855,130716469170,596639924972,399202499307,852415051723,15100232930,972951576673,320402866648,199045191877,443799960603,252755835304,539836473410,542643181709,400491413112,657250870956,204678559460,889706362732,475461628626,826546272311,613216718612,998926404932,357559884130,287665494906,720085045699,160701127613,104222154004,485786792515,574767889221,638339834246,396005948033,885271732136,648862147213,520764550828,390901856993,606308129632,731082206820,787396224484,95117278292,277386380523,429327727806,93919143712,334967237861,718716602180,980960175126,524586332808,674274729029,540302745039,742395106209,705217706916,251544926277,647969759189,557280643398,425856912937,978639854288,358035944832,504003396046,181631132520,3431302602,77257387430,867708294888,316250198241,145894385294,158015345409,874192949351,827852015176,125096018188,336550386404,1674582705,769357504668,273219005513,526659415624,444662511359,543211159783,958381905326,570844090626,150550404310,763227738658,267776487935,735773886043,279776627399,306862685004,271036324418,930286272708,126038501656,910961661984,500398590944,682762530509,38367702894,298855781623,516267213329,559916559530,729224486922,240223481800,226343340733,102792859500,140059041181,4341881681,115545474696,558669107813,298935506966,443400762747,988319739191,530901833193,588506641562,51945771411,32793281302,870377981929,582849066422,175665846043,649241659634,428832270770,515673606468,935322768634,239924602131,614431303617,475718341328,608346137969,798151331070,924160566609,341305716462,755884173148,584374849076,586107725823,945959620224,906542283576,957874005161,515652206321,305660719940,411151993631,881945528597,467960440104,49177563871,255679073905,989520966926,51019387165,365522578282,507608931909,317979273393,60486941878,373015417043,176107489548,315021998450,674746915692,28799852188,216354338185,617984356406,47092833522,127659840264,764296651037,551381424747,795634978082,315927932061,116123231089,664551866601,896675939530,197164852677,678433464141,266463328340,424950252410,456196525343,878371514834,522194716508,705645887809,474869826110,171585368394,653827705237,811254312988,783526573900,9718561131,101751087856,526847887581,463510833464,817437077891,898993656543,583419753539,725857307291,479589903329,253839814779,461313993303,238965301519,49209163610,992333062428,912481820327,235492044296,624400944123,634268317596,453087912982,694265853829,829426614064,994233278033,175321889673,349084095750,133147152975,856433868235,937186485779,74322677646,794430276963,441809135598,419702901298,196338552047,501505295882,45068598320,753578804761,161341528810,615029287016,508205087081,432576652680,254316754126,767668342443,889345471315,136757063111,986879775997,546613440068,519687456056,289671123830,207075447829,348087322944,85894378807,857491545133,256422924629,685686481950,758062461475,63279073581,585844213018,552566330779,920246522047,163629228983,936178244308,781451984952,933900102328,485290710862,142186174590,68081247061,606671514188,799221915479,714643506703,91190305268,970956700632,494866264809,992291939102,32885402327,929851223417,512795481691,167502306587,170157501650,447543425307,39906629709,873111577495,990568970425,365853064192,470548239443,461843150198,640528568330,994266877166,39366598807,153457186833,187832889708,505804779222,598050782434,645488545919,373451026889,794847554263,781896505066,313691575239,179397359161,312863955821,317945037898,773857867312,717607513880,897519537025,221088707295,257356300444,680335248572,151034995017,450630803666,851641684481,715373771827,693835634786,879884934884,219499104267,583542545996,661585822233,565814199986,868899112369,204704676460,219930298353,150035938772,550637348653,471048210403,913873435882,431992952709,749260931305,341927974680,625749428783,598346908646,912453230985,843765043104,203417776050,418672560526,832094136144,877234408626,897630868840,499228645230,416454626690,8867277761,387008225379,715084606910,729893305067,957761842324,507212184333,344056174658,569162057597,924699920372,158737864426,344921126395,156278733189,784780307311,29791997165,206091540340,231378928687,576452068578,705052109733,356716396231,560429694932,957859460960,630513006195,778704872892,258965135583,145735357895,641905831790,647475323764,455721879589,193006709593,486768060092,41456665700,971000903610,858705855853,866175106997,943104964295,46997652025,392699233695,658590250214,985939451151,198724607932,231045355732,479381110458,677209765830,864210404793,128950195612,823632705389,584031382005,154133340344,32671602922,965036043212,989878258209,322222597678,139998098234,878712149004,873253356200,943134919803,259413865955,303427696239,161587524835,775305773304,16940917347,100351004369,392114139180,106977397735,333167180197,496180280690,125562765225,595078039115,492044977140,619204143187,666312542330,537117771128,328914155317,752075092019,245717229158,198113502100,631813671004,759202431111,266759624681,215790896602,207342552427,247790783122,81885897479,519574713020,792607051874,627155025438,617688820299,350663745213,703618744719,473476200144,198154897726,264603146315,575972153842,406377977270,6945717781,264392138025,986396809948,675992749884,243586809135,915518009863,137725850317,513709971457,502120407865,561939551567,958229141967,856080628062,36275646914,432335125170,922614332213,979449594022,379524476621,889129490672,824103245018,823595454119,835041206431,943964021875,83179649532,246880419601,740779943253,353823057205,908368081471,916649924699,913551425312,342047717322,476291316071,993751733490,862069066676,8720901090,426893725834,915968370460,819126854479,381586048033,944146323311,210191926381,276394051110,574649993075,714680218328,397477830630,691380731165,566608867394,361108631507,204385542704,681708811729,889424767321,824393153861,231502033657,640547002204,299974112199,108284166783,368268094067,834367852718,877369963518,90489427424,555450560396,43036266822,829927567150,746533809195,314035952161,993364399535,903198123635,127456518515,42331332418,771705776611,271597951024,621121939745,587872869133,480555747140,396483916902,189531073719,43264124610,679990232693,244886923302,10400368529,547449633423,101704483429,166457191876,146958525236,781533012682,951411755216,418801264231,128889865977,919613073770,997014101705,927960367852,656764995117,70406643723,30449171043,248355155891,454383437737,505285962166,325726933564,233682232348,415919780355,441774944021,202912813569,982998319878,564762301009,611947593421,453297583719,539961183462,764265934294,719477876782,188487562784,740116655742,52277290821,726975739707,704894561007,649406553998,996998532587,906885157631,853998285368,859465871398,1646102228,100966315729,930247955210,81052609474,523252109556,386962961501,813984407856,233217888314,48078204279,335853209332,130645641181,17420657291,914800114262,452858836174,794707299420,175098540135,665487969876,649629934722,593395813707,207402630909,500970649791,686245886728,347736857092,935265625605,749481452748,542497635308,139983995745,288106008771,702300729399,498076240684,479290999660,621826008027,94880764863,711262320338,671088792991,429938470705,468845341749,39292170482,130077035562,638941980282,481889922971,801104402495,344374360840,963743096424,639832790159,612873267078,697780775803,333306595315,470548571054,300684466004,670279109120,935445688598,937854992755,424041828242,566868881833,778372910883,612036291983,773900236163,372470066587,283101945678,88198698073,486268361450,510571380057,716629686164,884555392537,352745948247,825114284335,256316604611,733308676451,73556249870,330622982067,290025501640,372928842059,295422610834,627001049575,586897291294,798572106622,769072623006,537810687261,386890197325,612997004447,389648102891,828408370515,434381372978,167731241180,606623045748,770152445292,253480055251,691878803985,204957537733,818734325090,399287773887,361073683577,826956054317,989542248496,736818977017,204069709351,193106555818,594979678860,296121780210,322808345894,575934537047,266764784071,408623281685,228447284517,477680954874,741549939429,57549067168,258212915986,379768653374,86050448565,864261840750,120272952682,341908545212,151377132360,880902128827,543669070075,137884419866,452332152009,317593399290,744045744518,587931770433,639655994147,879157865704,465300646841,364553221253,777847868968,851465124424,685456690484,501147075339,482464592030,390426960584,222801497568,642365717180,341596923224,366336767722,447242701875,182495998039,865771938089,576681189774,868405040600,870070458648,548376252491,793608946573,294727185065,232588731025,257838740903,539682652691,37052229006,461095915237,215872046280,335230862108,752410567053,771847050000,21785332877,602248107599,73429116594,314620878464,939748537260,5916942002,404657598777,89770938610,530954959164,555749247895,272619958142,758430225258,294085162685,740480620183,144815485373,275820817985,39121395178,32427381478,632186972128,662914131566,156962698663,733208115211,804767633762,587830160346,358030887461,801085713130,630873498706,369490497870,811028462575,440300029391,58141112124,226245612333,713588886467,54622251493,808981503461,825925061217,848573607026,36365128175,728066298600,491023134040,772455761705,303034163218,340289850617,213797546255,714831124872,23576034122,738496749321,69149501381,333464777272,636098974874,645939517971,646948878277,998109273444,670525556840,678594435449,458610106796,510969597651,285866436667,580375387919,309402820362,68680952612,94182632205,214413644445,446015553115,511316365829,813547849004,99322918567,440744992959,961947264757,762797636694,285619605164,870935024058,327731390628,362429729936,737188208071,294965963693,798288149463,601737935918,52074770733,746350568350,662374753999,199907696012,359694049773,662920355695,107472405271,317033510455,352007375808,949768567962,740252701710,960994705854,596841953510,418905005615,382453026112,882082508319,932687052358,46737000273,254791451676,413960404849,623886040312,304457516473,477110242175,584003106597,918014589909,620450499546,733701345884,225850542972,119014220577,268568025391,417403212210,130043890139,259144560891,70205263775,658057722068,291903506826,882680726555,296619561129,427699069879,155832235896,598945057905,833953664085,266328989016,126046558193,806841689123,912663824628,219059140576,200028718505,504273235536,844489828454,466470122637,314799428835,835707464677,414464618322,960759600724,44657171189,164765143970,458615513270,557283469166,660019411938,585183973475,267669943594,649053919612,682695281693,312699603295,928201603753,11837181661,337982289484,276969925539,912843040296,299106896696,345107444997,837243090950,374987491827,359602349808,515142629324,147115693958,363374542335,268998500056,83789251910,15625335845,607256628393,917966062761,222369986828,316440541805,335848160555,207566142637,545001579427,190329149395,422927128456,691857255104,932688472014,921005076336,361327974158,222546661226,745489882510,979028483530,451236859959,40195085391,394422061742,394897860220,256053295702,5849752375,84626662314,123003550743,524480899738,575805566856,624193174527,488442199742,683326950988,292208105239,904249107979,165285827655,695366606872,412790029283,565957925513,921892647536,676947673619,932283801361,302092253665,234725448014,794690263110,480935665236,899219634867,160713401513,273666703393,967548143982,231669649268,812696012562,914921988753,391481899429,744491047020,765500294154,412041039928,765639640306,277554196522,405934533668,674586205981,328501525377,42392004913,609613570235,410007179764
\ No newline at end of file
diff --git a/hudi-common/src/test/resources/format/record_positions_header_v3.data b/hudi-common/src/test/resources/format/record_positions_header_v3.data
new file mode 100644
index 0000000000000..a7561a853230a
--- /dev/null
+++ b/hudi-common/src/test/resources/format/record_positions_header_v3.data
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+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
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index d5e968069b26b..7069a06740fa1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -126,6 +126,7 @@
4.1.1
1.6.0
1.5.6
+ 0.9.47
0.16
0.8.0
4.5.13
@@ -939,6 +940,13 @@
compile