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

Reply via email to