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

yihua pushed a commit to branch branch-0.x
in repository https://gitbox.apache.org/repos/asf/hudi.git


The following commit(s) were added to refs/heads/branch-0.x by this push:
     new 39c2f8180473 [HUDI-9158] Add lock provider constructor which supports 
0.14.x LP constructor format (#13716)
39c2f8180473 is described below

commit 39c2f8180473547af7f2a8c87b228e73c0980e08
Author: Alex R <[email protected]>
AuthorDate: Wed Aug 13 00:31:19 2025 -0700

    [HUDI-9158] Add lock provider constructor which supports 0.14.x LP 
constructor format (#13716)
---
 .../transaction/lock/StorageBasedLockProvider.java     | 18 ++++++++++++++++++
 .../transaction/lock/TestStorageBasedLockProvider.java | 16 ++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/StorageBasedLockProvider.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/StorageBasedLockProvider.java
index 00f9bcd74742..9c3d1e3fdc43 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/StorageBasedLockProvider.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/StorageBasedLockProvider.java
@@ -18,6 +18,7 @@
 
 package org.apache.hudi.client.transaction.lock;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hudi.client.transaction.lock.models.HeartbeatManager;
 import org.apache.hudi.client.transaction.lock.models.LockGetResult;
 import 
org.apache.hudi.client.transaction.lock.models.LockProviderHeartbeatManager;
@@ -126,6 +127,23 @@ public class StorageBasedLockProvider implements 
LockProvider<StorageLockFile> {
             LOGGER);
   }
 
+  /**
+   * Default constructor for StorageBasedLockProvider, required by LockManager
+   * to instantiate it using reflection, supports 0.14.1 LP format.
+   * 
+   * @param lockConfiguration The lock configuration, should be transformable 
into
+   *                          StorageBasedLockConfig
+   * @param conf              Storage config, ignored.
+   */
+  public StorageBasedLockProvider(final LockConfiguration lockConfiguration, 
final Configuration conf) {
+    this(
+            UUID.randomUUID().toString(),
+            lockConfiguration.getConfig(),
+            LockProviderHeartbeatManager::new,
+            getStorageLockClientClassName(),
+            LOGGER);
+  }
+
   private static Functions.Function3<String, String, TypedProperties, 
StorageLockClient> getStorageLockClientClassName() {
     return (ownerId, lockFilePath, lockConfig) -> {
       try {
diff --git 
a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/transaction/lock/TestStorageBasedLockProvider.java
 
b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/transaction/lock/TestStorageBasedLockProvider.java
index 4e95c33371f8..e29ad17e551b 100644
--- 
a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/transaction/lock/TestStorageBasedLockProvider.java
+++ 
b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/transaction/lock/TestStorageBasedLockProvider.java
@@ -18,6 +18,7 @@
 
 package org.apache.hudi.client.transaction.lock;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hudi.client.transaction.lock.models.LockUpsertResult;
 import org.apache.hudi.client.transaction.lock.models.StorageLockData;
 import org.apache.hudi.client.transaction.lock.models.StorageLockFile;
@@ -114,6 +115,21 @@ class TestStorageBasedLockProvider {
     assertTrue(ex.getMessage().contains("Failed to load and initialize 
StorageLock"));
   }
 
+  @Test
+  void testHadoopConstructorWithLockConfigurationAndConfiguration() {
+    TypedProperties props = new TypedProperties();
+    props.put(BASE_PATH.key(), "file:///tmp/lake/db/tbl-default");
+    props.put(StorageBasedLockConfig.VALIDITY_TIMEOUT_SECONDS.key(), "20");
+    props.put(StorageBasedLockConfig.HEARTBEAT_POLL_SECONDS.key(), "2");
+
+    LockConfiguration lockConf = new LockConfiguration(props);
+
+    // Test that constructor throws expected exception when trying to load 
non-existent storage lock client
+    HoodieLockException ex = assertThrows(HoodieLockException.class,
+        () -> new StorageBasedLockProvider(lockConf, new Configuration()));
+    assertTrue(ex.getMessage().contains("Failed to load and initialize 
StorageLock"));
+  }
+
   @ParameterizedTest
   @ValueSource(strings = { "gs://bucket/lake/db/tbl-default", 
"s3://bucket/lake/db/tbl-default",
       "s3a://bucket/lake/db/tbl-default" })

Reply via email to