RATIS-1291. Send heartbeat when there is no reply by runzhiwang · Pull Request #398 · apache/ratis

What changes were proposed in this pull request?

Currently, when there always exist log, leader only send log, and will not send heartbeat. The problem is if follower need a
long time to process log, leader maybe receives response from follower after a long time.

  default long getHeartbeatRemainingTimeMs() {
    return getServer().properties().minRpcTimeoutMs()/2 - getFollower().getLastRpcTime().elapsedTimeMs();
  }

In this pr, I record lastRpcSendTimeWithResponse, i.e. when leader receive response of request1, leader record the send time of request1. Besides, I record lastHeartBeatSendTime, i.e. the send time of heartbeat.

Use this two timestamp, leader send heartbeat when can not receive response after minRpcTimeoutMs()/2. If log cost a
short time from request to reply, leader also does not need to send heartbeat.

  default long getHeartbeatRemainingTimeMs() {
    return getServer().properties().minRpcTimeoutMs()/2 -
       Math.min(getFollower().getLastRpcSendTimeWithResponse().elapsedTimeMs(),
           getFollower().getLastHeartBeatSendTime().elapsedTimeMs());
  }

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1291

How was this patch tested?

no need new ut