@Override
 public void run() {
   try {
     ClientLockManagerImpl.this.recall(session, lock, level, -1, batch);
   } catch (TCNotRunningException e) {
     logger.info(
         "Ignoring "
             + e.getMessage()
             + " in "
             + this.getClass().getName()
             + " and cancelling timer task");
   }
 }
    @Override
    public void run() {
      try {
        int gcCount = 0;
        for (final Entry<LockID, ClientLock> entry : ClientLockManagerImpl.this.locks.entrySet()) {
          ClientLockManagerImpl.this.stateGuard.readLock().lock();
          try {
            if (ClientLockManagerImpl.this.state != State.RUNNING) {
              return;
            }

            final LockID lock = entry.getKey();
            final ClientLock lockState = entry.getValue();
            if (lockState == null) {
              continue;
            }

            if (lockState.tryMarkAsGarbage(ClientLockManagerImpl.this.remoteLockManager)
                && ClientLockManagerImpl.this.locks.remove(lock, lockState)) {
              gcCount++;
            }
          } finally {
            ClientLockManagerImpl.this.stateGuard.readLock().unlock();
          }
        }
        if (gcCount > 0) {
          ClientLockManagerImpl.this.logger.info("Lock GC collected " + gcCount + " garbage locks");
        }

        if (gcCount > GCED_LOCK_THRESHOLD) {
          for (LockEventListener lockGCEventListener : lockEventListeners) {
            lockGCEventListener.fireLockGCEvent(gcCount);
          }
        }
      } catch (TCNotRunningException e) {
        logger.info(
            "Ignoring "
                + e.getMessage()
                + " in "
                + this.getClass().getName()
                + " and cancelling timer task");
      }
    }