diff --git a/hoodie-client/src/main/java/com/uber/hoodie/HoodieWriteClient.java b/hoodie-client/src/main/java/com/uber/hoodie/HoodieWriteClient.java index 846db2b40..0e63ac167 100644 --- a/hoodie-client/src/main/java/com/uber/hoodie/HoodieWriteClient.java +++ b/hoodie-client/src/main/java/com/uber/hoodie/HoodieWriteClient.java @@ -1286,9 +1286,12 @@ public class HoodieWriteClient implements Seriali HoodieCommitMetadata commitMetadata = HoodieCommitMetadata .fromBytes(table.getActiveTimeline().getInstantDetails(lastInstant .get()).get(), HoodieCommitMetadata.class); - rollingStatMetadata = rollingStatMetadata - .merge(HoodieCommitMetadata.fromBytes(commitMetadata.getExtraMetadata() - .get(HoodieRollingStatMetadata.ROLLING_STAT_METADATA_KEY).getBytes(), HoodieRollingStatMetadata.class)); + Optional lastRollingStat = Optional.ofNullable(commitMetadata.getExtraMetadata() + .get(HoodieRollingStatMetadata.ROLLING_STAT_METADATA_KEY)); + if (lastRollingStat.isPresent()) { + rollingStatMetadata = rollingStatMetadata + .merge(HoodieCommitMetadata.fromBytes(lastRollingStat.get().getBytes(), HoodieRollingStatMetadata.class)); + } } metadata.addMetadata(HoodieRollingStatMetadata.ROLLING_STAT_METADATA_KEY, rollingStatMetadata.toJsonString()); } catch (IOException io) { diff --git a/hoodie-client/src/main/java/com/uber/hoodie/table/HoodieMergeOnReadTable.java b/hoodie-client/src/main/java/com/uber/hoodie/table/HoodieMergeOnReadTable.java index b7d7a5080..77e6ddf4f 100644 --- a/hoodie-client/src/main/java/com/uber/hoodie/table/HoodieMergeOnReadTable.java +++ b/hoodie-client/src/main/java/com/uber/hoodie/table/HoodieMergeOnReadTable.java @@ -307,10 +307,13 @@ public class HoodieMergeOnReadTable extends if (lastInstant.isPresent()) { HoodieCommitMetadata commitMetadata = HoodieCommitMetadata.fromBytes( this.getActiveTimeline().getInstantDetails(lastInstant.get()).get(), HoodieCommitMetadata.class); - HoodieRollingStatMetadata rollingStatMetadata = HoodieCommitMetadata - .fromBytes(commitMetadata.getExtraMetadata().get(HoodieRollingStatMetadata.ROLLING_STAT_METADATA_KEY) - .getBytes(), HoodieRollingStatMetadata.class); - return rollingStatMetadata; + Optional lastRollingStat = Optional.ofNullable(commitMetadata.getExtraMetadata() + .get(HoodieRollingStatMetadata.ROLLING_STAT_METADATA_KEY)); + if (lastRollingStat.isPresent()) { + HoodieRollingStatMetadata rollingStatMetadata = HoodieCommitMetadata + .fromBytes(lastRollingStat.get().getBytes(), HoodieRollingStatMetadata.class); + return rollingStatMetadata; + } } return null; } catch (IOException e) { diff --git a/hoodie-client/src/test/java/com/uber/hoodie/table/TestMergeOnReadTable.java b/hoodie-client/src/test/java/com/uber/hoodie/table/TestMergeOnReadTable.java index 92c40e7e8..ed68e5857 100644 --- a/hoodie-client/src/test/java/com/uber/hoodie/table/TestMergeOnReadTable.java +++ b/hoodie-client/src/test/java/com/uber/hoodie/table/TestMergeOnReadTable.java @@ -911,7 +911,14 @@ public class TestMergeOnReadTable { HoodieTableMetaClient metaClient = new HoodieTableMetaClient(jsc.hadoopConfiguration(), basePath); HoodieTable table = HoodieTable.getHoodieTable(metaClient, cfg, jsc); - String commitTime = "000"; + // Create a commit without rolling stats in metadata to test backwards compatibility + HoodieActiveTimeline activeTimeline = table.getActiveTimeline(); + String commitActionType = table.getMetaClient().getCommitActionType(); + HoodieInstant instant = new HoodieInstant(true, commitActionType, "000"); + activeTimeline.createInflight(instant); + activeTimeline.saveAsComplete(instant, Optional.empty()); + + String commitTime = "001"; client.startCommitWithTime(commitTime); HoodieTestDataGenerator dataGen = new HoodieTestDataGenerator(); @@ -936,7 +943,7 @@ public class TestMergeOnReadTable { } Assert.assertEquals(inserts, 200); - commitTime = "001"; + commitTime = "002"; client.startCommitWithTime(commitTime); records = dataGen.generateUpdates(commitTime, records); writeRecords = jsc.parallelize(records, 1);