private void appendLog()

in ratis-grpc/src/main/java/org/apache/ratis/grpc/server/GrpcLogAppender.java [394:432]


  private void appendLog(boolean heartbeat) throws IOException {
    final ReferenceCountedObject<AppendEntriesRequestProto> pending;
    final AppendEntriesRequest request;
    try (AutoCloseableLock writeLock = lock.writeLock(caller, LOG::trace)) {
      if (!isRunning()) {
        return;
      }
      // Prepare and send the append request.
      // Note changes on follower's nextIndex and ops on pendingRequests should always be done under the write-lock
      pending = nextAppendEntriesRequest(callId.getAndIncrement(), heartbeat);
      if (pending == null) {
        return;
      }
      try {
        request = new AppendEntriesRequest(pending.get(), getFollowerId(), grpcServerMetrics);
        pendingRequests.put(request);
        increaseNextIndex(pending.get());
        if (appendLogRequestObserver == null) {
          appendLogRequestObserver = new StreamObservers(
              getClient(), new AppendLogResponseHandler(), useSeparateHBChannel, getWaitTimeMin());
        }
      } catch (Exception e) {
        pending.release();
        throw e;
      }
    }

    try {
      final TimeDuration remaining = getRemainingWaitTime();
      if (remaining.isPositive()) {
        sleep(remaining, heartbeat);
      }
      if (isRunning()) {
        sendRequest(request, pending.get());
      }
    } finally {
      pending.release();
    }
  }