private void rescheduleMaybeFenceStaleBrokers() {
        long nextCheckTimeNs = clusterControl.heartbeatManager().nextCheckTimeNs();
        if (nextCheckTimeNs == Long.MAX_VALUE) {
            cancelMaybeFenceReplicas();
            return;
        }
        scheduleDeferredWriteEvent(MAYBE_FENCE_REPLICAS, nextCheckTimeNs,
            () -> {
                ControllerResult<Void> result = replicationControl.maybeFenceOneStaleBroker();
                // This following call ensures that if there are multiple brokers that
                // are currently stale, then fencing for them is scheduled immediately
                rescheduleMaybeFenceStaleBrokers();
                return result;
            },
            EnumSet.of(DOES_NOT_UPDATE_QUEUE_TIME));
    }
Append records to the Raft log. They will be written out asynchronously.

@param log                   The log4j logger.
@param result                The controller result we are writing out.
@param maxRecordsPerBatch    The maximum number of records to allow in a batch.
@param appender              The callback to invoke for each batch. The arguments are last
                             write offset, record list, and the return result is the new
                             last write offset.
@return                      The final offset that was returned from the Raft layer.
metadata/src/main/java/org/apache/kafka/controller/QuorumController.java