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:
Eddie Cho
2023-08-16 01:48:03 +08:00
committed by GitHub
parent 0450a323ec
commit ba6d35d123

View File

@@ -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. " +