code: public void releaseLock (final NodeObject.Lock lock, final ResultListener<String> listener)
      {
          // wait until any pending resolution is complete
          queryLock(lock, new ChainedResultListener<String, String>(listener) {
              public void requestCompleted (String result) {
                  if (Objects.equal(_nodeName, result)) {
                      if (_suboids.isEmpty()) {
                          lockReleased(lock, listener);
                      } else {
                          _locks.put(lock, new LockHandler(lock, false, listener));
                      }
                  } else {
                      if (result != null) {
                          log.warning("Tried to release lock held by another peer", "lock", lock,
                                      "owner", result);
                      }
                      listener.requestCompleted(result);
                  }
              }
          });
      }
docs: Releases a lock.  This can be cancelled using {@link #reacquireLock}, in which case the
  passed listener will receive this node's name as opposed to <code>null</code>, which
  signifies that the lock has been successfully released.