GH-8699: Fix Issue of removeLockKey()
In the current code, an `IllegalStateException` might be thrown from the try block while invoking the `removeLockKeyInnerUnlink()` method, especially when caused by key expiration (resulting in `unlinkResult == false`). This triggers the check block, which incorrectly sets the `unlinkAvailable` flag to `false`, even if the Redis server supports the unlink operation. As a consequence, the subsequent `removeLockKeyInnerDelete()` method is invoked when it should not be. * `IllegalStateException` should not be thrown from try block * Add a comment and fix Checkstyle violations **Cherry-pick to `6.1.x` & `6.0.x`**
This commit is contained in:
@@ -476,13 +476,10 @@ public final class RedisLockRegistry implements ExpirableLockRegistry, Disposabl
|
||||
|
||||
private void removeLockKey() {
|
||||
if (RedisLockRegistry.this.unlinkAvailable) {
|
||||
Boolean unlinkResult = null;
|
||||
try {
|
||||
boolean unlinkResult = removeLockKeyInnerUnlink();
|
||||
if (!unlinkResult) {
|
||||
throw new IllegalStateException("Lock was released in the store due to expiration. " +
|
||||
"The integrity of data protected by this lock may have been compromised.");
|
||||
}
|
||||
return;
|
||||
// Attempt to UNLINK the lock key; an exception indicates lack of UNLINK support
|
||||
unlinkResult = removeLockKeyInnerUnlink();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
RedisLockRegistry.this.unlinkAvailable = false;
|
||||
@@ -495,6 +492,15 @@ public final class RedisLockRegistry implements ExpirableLockRegistry, Disposabl
|
||||
"falling back to the regular DELETE command: " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (Boolean.TRUE.equals(unlinkResult)) {
|
||||
// Lock key successfully unlinked
|
||||
return;
|
||||
}
|
||||
else if (Boolean.FALSE.equals(unlinkResult)) {
|
||||
throw new IllegalStateException("Lock was released in the store due to expiration. " +
|
||||
"The integrity of data protected by this lock may have been compromised.");
|
||||
}
|
||||
}
|
||||
if (!removeLockKeyInnerDelete()) {
|
||||
throw new IllegalStateException("Lock was released in the store due to expiration. " +
|
||||
|
||||
Reference in New Issue
Block a user