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();
}
}