This is an automated email from the ASF dual-hosted git repository.
danny0405 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 552b8d13450 [HUDI-9494] Fix small shutdown hook race condition in
StorageBasedLockProvider (#13395)
552b8d13450 is described below
commit 552b8d134504f6aebe7b27455c868b8bc92b7f57
Author: Alex R <[email protected]>
AuthorDate: Wed Jun 4 18:11:47 2025 -0700
[HUDI-9494] Fix small shutdown hook race condition in
StorageBasedLockProvider (#13395)
---
.../client/transaction/lock/StorageBasedLockProvider.java | 11 ++++++++++-
.../client/transaction/lock/TestStorageBasedLockProvider.java | 9 +++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
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 6df4de883dd..d1f6f14b92f 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
@@ -220,7 +220,11 @@ public class StorageBasedLockProvider implements
LockProvider<StorageLockFile> {
// Do not execute any further actions
return;
} else {
- Runtime.getRuntime().removeShutdownHook(shutdownThread);
+ try {
+ tryRemoveShutdownHook();
+ } catch (IllegalStateException e) {
+ logger.warn("Owner {}: Failed to remove shutdown hook, JVM is already
shutting down.", ownerId, e);
+ }
}
try {
this.unlock();
@@ -241,6 +245,11 @@ public class StorageBasedLockProvider implements
LockProvider<StorageLockFile> {
this.isClosed = true;
}
+ @VisibleForTesting
+ void tryRemoveShutdownHook() {
+ Runtime.getRuntime().removeShutdownHook(shutdownThread);
+ }
+
private synchronized boolean isLockStillValid(StorageLockFile lock) {
return !lock.isExpired() &&
!isCurrentTimeCertainlyOlderThanDistributedTime(lock.getValidUntilMs());
}
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 2a924d830b3..414513ce4f5 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
@@ -564,6 +564,15 @@ class TestStorageBasedLockProvider {
verify(mockHeartbeatManager, never()).close();
}
+ @Test
+ public void testShutdownHookFailsToBeRemoved() throws Exception {
+ doThrow(new IllegalStateException("Shutdown already in
progress")).when(lockProvider).tryRemoveShutdownHook();
+ lockProvider.close();
+ verify(mockLockService, atLeastOnce()).close();
+ verify(mockHeartbeatManager, atLeastOnce()).close();
+ assertNull(lockProvider.getLock());
+ }
+
public static class StubStorageLockClient implements StorageLockClient {
public StubStorageLockClient(String ownerId, String lockFileUri,
Properties props) {
assertTrue(lockFileUri.endsWith("table_lock.json"));