This is an automated email from the ASF dual-hosted git repository.
vbalaji pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new 3ca1fb39564 [HUDI-7262] Validate checksum only if it exists (#10417)
3ca1fb39564 is described below
commit 3ca1fb395649d5c7ed2bb44c66d52f8d4168b291
Author: Jing Zhang <[email protected]>
AuthorDate: Thu Dec 28 05:58:07 2023 +0800
[HUDI-7262] Validate checksum only if it exists (#10417)
---
.../org/apache/hudi/common/util/ConfigUtils.java | 6 +++-
.../hudi/common/table/TestHoodieTableConfig.java | 6 ++--
.../TestUpgradeOrDowngradeProcedure.scala | 36 ++++++++++++++++++++--
3 files changed, 43 insertions(+), 5 deletions(-)
diff --git
a/hudi-common/src/main/java/org/apache/hudi/common/util/ConfigUtils.java
b/hudi-common/src/main/java/org/apache/hudi/common/util/ConfigUtils.java
index 518ff5e2c8e..c5bdb42ef3c 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/util/ConfigUtils.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/util/ConfigUtils.java
@@ -45,6 +45,8 @@ import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
+import static org.apache.hudi.common.table.HoodieTableConfig.TABLE_CHECKSUM;
+
public class ConfigUtils {
public static final String STREAMER_CONFIG_PREFIX = "hoodie.streamer.";
@Deprecated
@@ -565,7 +567,9 @@ public class ConfigUtils {
props.clear();
props.load(is);
found = true;
-
ValidationUtils.checkArgument(HoodieTableConfig.validateChecksum(props));
+ if (props.containsKey(TABLE_CHECKSUM.key())) {
+
ValidationUtils.checkArgument(HoodieTableConfig.validateChecksum(props));
+ }
return props;
} catch (IOException e) {
LOG.warn(String.format("Could not read properties from %s: %s",
path, e));
diff --git
a/hudi-common/src/test/java/org/apache/hudi/common/table/TestHoodieTableConfig.java
b/hudi-common/src/test/java/org/apache/hudi/common/table/TestHoodieTableConfig.java
index 4eb6d4b7b7b..040ad775474 100644
---
a/hudi-common/src/test/java/org/apache/hudi/common/table/TestHoodieTableConfig.java
+++
b/hudi-common/src/test/java/org/apache/hudi/common/table/TestHoodieTableConfig.java
@@ -40,6 +40,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import static org.apache.hudi.common.table.HoodieTableConfig.TABLE_CHECKSUM;
import static org.apache.hudi.common.util.ConfigUtils.recoverIfNeeded;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -161,14 +162,15 @@ public class TestHoodieTableConfig extends
HoodieCommonTestHarness {
// Should return backup config if hoodie.properties is corrupted
Properties props = new Properties();
+ props.put(TABLE_CHECKSUM.key(), "0");
try (FSDataOutputStream out = fs.create(cfgPath)) {
- props.store(out, "No checksum in file so is invalid");
+ props.store(out, "Wrong checksum in file so is invalid");
}
new HoodieTableConfig(fs, metaPath.toString(), null, null);
// Should throw exception if both hoodie.properties and backup are
corrupted
try (FSDataOutputStream out = fs.create(backupCfgPath)) {
- props.store(out, "No checksum in file so is invalid");
+ props.store(out, "Wrong checksum in file so is invalid");
}
assertThrows(IllegalArgumentException.class, () -> new
HoodieTableConfig(fs, metaPath.toString(), null, null));
}
diff --git
a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/procedure/TestUpgradeOrDowngradeProcedure.scala
b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/procedure/TestUpgradeOrDowngradeProcedure.scala
index 1bd29cabc40..20fcd820337 100644
---
a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/procedure/TestUpgradeOrDowngradeProcedure.scala
+++
b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/procedure/TestUpgradeOrDowngradeProcedure.scala
@@ -20,9 +20,11 @@ package org.apache.spark.sql.hudi.procedure
import org.apache.hadoop.fs.Path
import org.apache.hudi.common.config.HoodieConfig
import org.apache.hudi.common.table.{HoodieTableConfig, HoodieTableMetaClient,
HoodieTableVersion}
+import org.apache.hudi.common.util.{BinaryUtil, ConfigUtils, StringUtils}
import org.apache.spark.api.java.JavaSparkContext
import java.io.IOException
+import java.time.Instant
class TestUpgradeOrDowngradeProcedure extends HoodieSparkProcedureTestBase {
@@ -104,8 +106,38 @@ class TestUpgradeOrDowngradeProcedure extends
HoodieSparkProcedureTestBase {
// downgrade table to THREE
checkAnswer(s"""call downgrade_table(table => '$tableName', to_version
=> 'THREE')""")(Seq(true))
- // upgrade table to FOUR
- checkAnswer(s"""call upgrade_table(table => '$tableName', to_version =>
'FOUR')""")(Seq(true))
+ var metaClient = HoodieTableMetaClient.builder
+ .setConf(new
JavaSparkContext(spark.sparkContext).hadoopConfiguration())
+ .setBasePath(tablePath)
+ .build
+ // verify hoodie.table.version of the table is THREE
+ assertResult(HoodieTableVersion.THREE.versionCode) {
+ metaClient.getTableConfig.getTableVersion.versionCode()
+ }
+ val metaPathDir = new Path(metaClient.getBasePath,
HoodieTableMetaClient.METAFOLDER_NAME)
+ // delete checksum from hoodie.properties
+ val props = ConfigUtils.fetchConfigs(metaClient.getFs,
metaPathDir.toString, HoodieTableConfig.HOODIE_PROPERTIES_FILE,
HoodieTableConfig.HOODIE_PROPERTIES_FILE_BACKUP, 1, 1000)
+ props.remove(HoodieTableConfig.TABLE_CHECKSUM.key)
+ try {
+ val outputStream = metaClient.getFs.create(new Path(metaPathDir,
HoodieTableConfig.HOODIE_PROPERTIES_FILE))
+ props.store(outputStream, "Updated at " + Instant.now)
+ outputStream.close()
+ } catch {
+ case e: Exception => fail(e)
+ }
+ // verify hoodie.table.checksum is deleted from hoodie.properties
+ metaClient = HoodieTableMetaClient.reload(metaClient)
+ assertResult(false)
{metaClient.getTableConfig.contains(HoodieTableConfig.TABLE_CHECKSUM)}
+ // upgrade table to SIX
+ checkAnswer(s"""call upgrade_table(table => '$tableName', to_version =>
'SIX')""")(Seq(true))
+ metaClient = HoodieTableMetaClient.reload(metaClient)
+ assertResult(HoodieTableVersion.SIX.versionCode) {
+ metaClient.getTableConfig.getTableVersion.versionCode()
+ }
+ val expectedCheckSum =
BinaryUtil.generateChecksum(StringUtils.getUTF8Bytes(tableName))
+ assertResult(expectedCheckSum) {
+ metaClient.getTableConfig.getLong(HoodieTableConfig.TABLE_CHECKSUM)
+ }
}
}