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" })