This is an automated email from the ASF dual-hosted git repository.

yihua 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 658e964cf77 [HUDI-7668] Add and rename APIs in StorageConfiguration 
(#11102)
658e964cf77 is described below

commit 658e964cf7711f61d476e4e9bc5f67eff817c3ab
Author: Y Ethan Guo <[email protected]>
AuthorDate: Fri Apr 26 16:25:13 2024 -0700

    [HUDI-7668] Add and rename APIs in StorageConfiguration (#11102)
---
 .../org/apache/hudi/hadoop/fs/HadoopFSUtils.java   |  2 +-
 .../storage/hadoop/HadoopStorageConfiguration.java | 11 ++++++---
 .../apache/hudi/storage/StorageConfiguration.java  | 27 ++++++++++++++++++----
 .../io/storage/BaseTestStorageConfiguration.java   | 18 +++++++++++----
 4 files changed, 46 insertions(+), 12 deletions(-)

diff --git 
a/hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java 
b/hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java
index 78b293ee75f..80d881a45fa 100644
--- 
a/hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java
+++ 
b/hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java
@@ -80,7 +80,7 @@ public class HadoopFSUtils {
   }
 
   public static <T> FileSystem getFs(Path path, StorageConfiguration<T> 
storageConf, boolean newCopy) {
-    T conf = newCopy ? storageConf.newCopy() : storageConf.get();
+    T conf = newCopy ? storageConf.unwrapCopy() : storageConf.unwrap();
     ValidationUtils.checkArgument(conf instanceof Configuration);
     return getFs(path, (Configuration) conf);
   }
diff --git 
a/hudi-hadoop-common/src/main/java/org/apache/hudi/storage/hadoop/HadoopStorageConfiguration.java
 
b/hudi-hadoop-common/src/main/java/org/apache/hudi/storage/hadoop/HadoopStorageConfiguration.java
index a0009aaf75a..f272f8333eb 100644
--- 
a/hudi-hadoop-common/src/main/java/org/apache/hudi/storage/hadoop/HadoopStorageConfiguration.java
+++ 
b/hudi-hadoop-common/src/main/java/org/apache/hudi/storage/hadoop/HadoopStorageConfiguration.java
@@ -54,16 +54,21 @@ public class HadoopStorageConfiguration extends 
StorageConfiguration<Configurati
   }
 
   public HadoopStorageConfiguration(HadoopStorageConfiguration configuration) {
-    this.configuration = configuration.newCopy();
+    this.configuration = configuration.unwrapCopy();
   }
 
   @Override
-  public Configuration get() {
+  public StorageConfiguration<Configuration> newInstance() {
+    return new HadoopStorageConfiguration(this);
+  }
+
+  @Override
+  public Configuration unwrap() {
     return configuration;
   }
 
   @Override
-  public Configuration newCopy() {
+  public Configuration unwrapCopy() {
     return new Configuration(configuration);
   }
 
diff --git 
a/hudi-io/src/main/java/org/apache/hudi/storage/StorageConfiguration.java 
b/hudi-io/src/main/java/org/apache/hudi/storage/StorageConfiguration.java
index d92eeab8bed..c0a60490f21 100644
--- a/hudi-io/src/main/java/org/apache/hudi/storage/StorageConfiguration.java
+++ b/hudi-io/src/main/java/org/apache/hudi/storage/StorageConfiguration.java
@@ -31,14 +31,20 @@ import java.io.Serializable;
  */
 public abstract class StorageConfiguration<T> implements Serializable {
   /**
-   * @return the storage configuration.
+   * @return a new {@link StorageConfiguration} instance with a new copy of
+   * the configuration of type {@link T}.
    */
-  public abstract T get();
+  public abstract StorageConfiguration<T> newInstance();
 
   /**
-   * @return a new copy of the storage configuration.
+   * @return the underlying configuration of type {@link T}.
    */
-  public abstract T newCopy();
+  public abstract T unwrap();
+
+  /**
+   * @return a new copy of the underlying configuration of type {@link T}.
+   */
+  public abstract T unwrapCopy();
   
   /**
    * Sets the configuration key-value pair.
@@ -108,4 +114,17 @@ public abstract class StorageConfiguration<T> implements 
Serializable {
         ? Enum.valueOf(defaultValue.getDeclaringClass(), value.get())
         : defaultValue;
   }
+
+  /**
+   * Sets a property key with a value in the configuration, if the property key
+   * does not already exist.
+   *
+   * @param key   property key.
+   * @param value property value.
+   */
+  public final void setIfUnset(String key, String value) {
+    if (getString(key).isEmpty()) {
+      set(key, value);
+    }
+  }
 }
diff --git 
a/hudi-io/src/test/java/org/apache/hudi/io/storage/BaseTestStorageConfiguration.java
 
b/hudi-io/src/test/java/org/apache/hudi/io/storage/BaseTestStorageConfiguration.java
index 19ae29da985..1d6a3d338e4 100644
--- 
a/hudi-io/src/test/java/org/apache/hudi/io/storage/BaseTestStorageConfiguration.java
+++ 
b/hudi-io/src/test/java/org/apache/hudi/io/storage/BaseTestStorageConfiguration.java
@@ -47,11 +47,13 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 public abstract class BaseTestStorageConfiguration<T> {
   private static final Map<String, String> EMPTY_MAP = new HashMap<>();
   private static final String KEY_STRING = "hudi.key.string";
+  private static final String KEY_STRING_OTHER = "hudi.key.string.other";
   private static final String KEY_BOOLEAN = "hudi.key.boolean";
   private static final String KEY_LONG = "hudi.key.long";
   private static final String KEY_ENUM = "hudi.key.enum";
   private static final String KEY_NON_EXISTENT = "hudi.key.non_existent";
   private static final String VALUE_STRING = "string_value";
+  private static final String VALUE_STRING_1 = "string_value_1";
   private static final String VALUE_BOOLEAN = "true";
   private static final String VALUE_LONG = "12309120";
   private static final String VALUE_ENUM = TestEnum.ENUM2.toString();
@@ -68,11 +70,14 @@ public abstract class BaseTestStorageConfiguration<T> {
   protected abstract T getConf(Map<String, String> mapping);
 
   @Test
-  public void testConstructorGetNewCopy() {
+  public void testConstructorNewInstanceUnwrapCopy() {
     T conf = getConf(EMPTY_MAP);
     StorageConfiguration<T> storageConf = getStorageConfiguration(conf);
-    assertSame(storageConf.get(), storageConf.get());
-    assertNotSame(storageConf.get(), storageConf.newCopy());
+    StorageConfiguration<T> newStorageConf = storageConf.newInstance();
+    assertNotSame(storageConf, newStorageConf);
+    assertNotSame(storageConf.unwrap(), newStorageConf.unwrap());
+    assertSame(storageConf.unwrap(), storageConf.unwrap());
+    assertNotSame(storageConf.unwrap(), storageConf.unwrapCopy());
   }
 
   @Test
@@ -85,6 +90,11 @@ public abstract class BaseTestStorageConfiguration<T> {
     storageConf.set(KEY_BOOLEAN, VALUE_BOOLEAN);
     assertEquals(Option.of(VALUE_STRING), storageConf.getString(KEY_STRING));
     assertTrue(storageConf.getBoolean(KEY_BOOLEAN, false));
+
+    storageConf.setIfUnset(KEY_STRING, VALUE_STRING + "_1");
+    storageConf.setIfUnset(KEY_STRING_OTHER, VALUE_STRING_1);
+    assertEquals(Option.of(VALUE_STRING), storageConf.getString(KEY_STRING));
+    assertEquals(Option.of(VALUE_STRING_1), 
storageConf.getString(KEY_STRING_OTHER));
   }
 
   @Test
@@ -102,7 +112,7 @@ public abstract class BaseTestStorageConfiguration<T> {
       try (ByteArrayInputStream bais = new 
ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais)) {
         StorageConfiguration<?> deserialized = (StorageConfiguration) 
ois.readObject();
-        assertNotNull(deserialized.get());
+        assertNotNull(deserialized.unwrap());
         validateConfigs(deserialized);
       }
     }

Reply via email to