in geode-core/src/main/java/org/apache/geode/distributed/internal/locks/DLockService.java [392:531]
private boolean makeLocalGrantor(InternalDistributedMember elder, boolean needsRecovery,
LockGrantorId myLockGrantorId, DLockGrantor myGrantor) {
final boolean isDebugEnabled_DLS = logger.isTraceEnabled(LogMarker.DLS_VERBOSE);
boolean success = false;
try {
synchronized (lockGrantorIdLock) {
if (isDestroyed()) {
checkDestroyed(); // exit
}
InternalDistributedMember currentElder = getElderId();
if (!currentElder.equals(elder)) {
// abort because elder changed
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE,
"Failed to create {} because elder changed from {} to {}", myLockGrantorId, elder,
currentElder);
}
return false; // exit
}
if (deposingLockGrantorId != null) {
if (deposingLockGrantorId.isNewerThan(myLockGrantorId)) {
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "Failed to create {} because I was deposed by {}",
myLockGrantorId, deposingLockGrantorId);
}
deposingLockGrantorId = null;
return false; // exit
}
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "{} failed to depose {}",
deposingLockGrantorId, myLockGrantorId);
}
// older grantor couldn't depose us, so null it out...
deposingLockGrantorId = null;
}
if (!setLockGrantorId(myLockGrantorId, myGrantor)) {
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE,
"[getLockGrantorId] failed to create {} because current grantor is {}",
myLockGrantorId, lockGrantorId);
}
return false; // exit
}
} // release sync on this.lockGrantorIdLock
// do NOT sync while doing recovery (because it waits for replies)
if (needsRecovery) {
boolean recovered =
DLockRecoverGrantorProcessor.recoverLockGrantor(dm.getDistributionManagerIds(),
this, // this lock service
myGrantor, dm, elder); // the elder that told us to be the grantor
if (!recovered) {
checkDestroyed();
return false; // exit
}
}
// after recovery, resynchronize on lockGrantorIdLock again
// check to see if myLockGrantorId has been deposed
synchronized (lockGrantorIdLock) {
if (isDestroyed()) {
checkDestroyed(); // exit
}
if (deposingLockGrantorId != null) {
if (deposingLockGrantorId.isNewerThan(myLockGrantorId)) {
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "Failed to create {} because I was deposed by {}",
myLockGrantorId, deposingLockGrantorId);
}
deposingLockGrantorId = null;
return false; // exit
}
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "{} failed to depose {}",
deposingLockGrantorId, myLockGrantorId);
}
deposingLockGrantorId = null;
}
if (checkLockGrantorId(myLockGrantorId)) {
success = myGrantor.makeReady(true); // do not enforce initializing
}
}
return success; // exit
} catch (VirtualMachineError err) {
SystemFailure.initiateFailure(err);
// If this ever returns, rethrow the error. We're poisoned
// now, so don't let this thread continue.
throw err;
} catch (Error e) {
// Whenever you catch Error or Throwable, you must also
// catch VirtualMachineError (see above). However, there is
// _still_ a possibility that you are dealing with a cascading
// error condition, so you also need to check to see if the JVM
// is still usable:
SystemFailure.checkFailure();
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "[makeLocalGrantor] throwing Error", e);
}
throw e;
} catch (RuntimeException e) {
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "[makeLocalGrantor] throwing RuntimeException", e);
}
throw e;
} finally {
try {
// abort if unsuccessful or if lock service was destroyed
if (!success || isDestroyed()) {
if (isDebugEnabled_DLS) {
logger.trace(LogMarker.DLS_VERBOSE, "[makeLocalGrantor] aborting {} and {}",
myLockGrantorId, myGrantor);
}
nullLockGrantorId(myLockGrantorId);
if (!myGrantor.isDestroyed()) {
myGrantor.destroy();
}
}
} finally {
// assertion: grantor should now be either ready or destroyed!
if (myGrantor.isInitializing() && !dm.getCancelCriterion().isCancelInProgress()) {
logger.error(LogMarker.DLS_MARKER,
"Grantor is still initializing");
}
if (!success && !myGrantor.isDestroyed() && !dm.getCancelCriterion().isCancelInProgress()) {
logger.error(LogMarker.DLS_MARKER,
"Grantor creation was aborted but grantor was not destroyed");
}
}
}
}