protected void releaseIfLockedBy(InternalDistributedMember owner, int lockId) {
      final RemoteThread rThread = getRemoteThread();
      boolean released = false;
      try {
        released = releaseLock(owner, lockId);
      } catch (IllegalStateException e) {
        dlock.checkDestroyed();
        grantor.checkDestroyed();
        // must have hit race... grantor doesn't have the token
        return;
      }
      if (released) {
        // don't bother synchronizing requests for this log statement...
        if (logger.isTraceEnabled(LogMarker.DLS_VERBOSE)) {
          synchronized (this) {
            logger.trace(LogMarker.DLS_VERBOSE,
                "[DLockGrantToken.releaseIfLockedBy] pending requests: {}",
                (pendingRequests == null ? "none" : "" + pendingRequests.size()));
          }
        }
        Assert.assertTrue(rThread != null);
        // releaseIfLockedBy (remote unlock)
        grantor.postReleaseLock(rThread, getName());
        // note: DLockReleaseMessage calls drainPermittedRequests next...
      }
    }
Called to release a remote lock when processing a DLockReleaseMessage.
<p>
Caller must synchronize on this grant token.
<p>
Call stack: DLockReleaseMessage -> releaseIfLocked -> getAndReleaseGrantIfLockedBy ->
grant.releaseIfLockedBy

Concurrency: protected by synchronization of *this* DLockGrantToken

@param owner the member to release the lock for
@param lockId the lock id that the member used to acquire the lock
geode-core/src/main/java/org/apache/geode/distributed/internal/locks/DLockGrantor.java