INT-4447: LockRegLeaderInit: Catch unlock errors
JIRA: https://jira.spring.io/browse/INT-4447 When we get an exception during `this.lock.unlock()`, we don't revoke leadership. In case of external resource (e.g. JDBC) this may cause a race condition when the second candidate is selected as leader when connection comes back * Catch `this.lock.unlock()` exceptions and log them under DEBUG. This way we proceed to the `handleRevoked()` logic **Cherry-pick to 5.0.x and 4.3.x**
This commit is contained in:
committed by
Gary Russell
parent
4e157725b9
commit
15fc23c2fa
@@ -381,8 +381,15 @@ public class LockRegistryLeaderInitiator implements SmartLifecycle, DisposableBe
|
||||
}
|
||||
catch (Exception e) {
|
||||
if (this.locked) {
|
||||
this.lock.unlock();
|
||||
this.locked = false;
|
||||
try {
|
||||
this.lock.unlock();
|
||||
}
|
||||
catch (Exception e1) {
|
||||
logger.debug("Could not unlock - treat as broken. " +
|
||||
"Revoking " + (isRunning() ? " and retrying..." : "..."), e);
|
||||
|
||||
}
|
||||
// The lock was broken and we are no longer leader
|
||||
handleRevoked();
|
||||
if (isRunning()) {
|
||||
@@ -408,11 +415,16 @@ public class LockRegistryLeaderInitiator implements SmartLifecycle, DisposableBe
|
||||
}
|
||||
finally {
|
||||
if (this.locked) {
|
||||
this.lock.unlock();
|
||||
this.locked = false;
|
||||
try {
|
||||
this.lock.unlock();
|
||||
}
|
||||
catch (Exception e) {
|
||||
logger.debug("Could not unlock during stop - treat as broken. Revoking...", e);
|
||||
}
|
||||
// We are stopping, therefore not leading any more
|
||||
handleRevoked();
|
||||
}
|
||||
this.locked = false;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user