protected AppendEntriesRequestProto createRequest(long callId) throws RaftLogIOException {
final TermIndex previous = getPrevious();
final long heartbeatRemainingMs = getHeartbeatRemainingTime();
if (heartbeatRemainingMs <= 0L) {
return leaderState.newAppendEntriesRequestProto(
getFollowerId(), previous, Collections.emptyList(), !follower.isAttendingVote(), callId);
}
Preconditions.assertTrue(buffer.isEmpty(), () -> "buffer has " + buffer.getNumElements() + " elements.");
final long leaderNext = raftLog.getNextIndex();
for (long next = follower.getNextIndex(); leaderNext > next; ) {
if (!buffer.offer(raftLog.getEntryWithData(next++))) {
break;
}
}
if (buffer.isEmpty()) {
return null;
}
final List<LogEntryProto> protos = buffer.pollList(heartbeatRemainingMs, EntryWithData::getEntry,
(entry, time, exception) -> LOG.warn(this + ": Failed get " + entry + " in " + time, exception));
buffer.clear();
return leaderState.newAppendEntriesRequestProto(
getFollowerId(), previous, protos, !follower.isAttendingVote(), callId);
}