The `recoverLocallyUpToGlobalCheckpoint` step of peer recovery may take an extended period of time, but today we do not disable the recovery monitor during this step so if it takes more than 30 minutes (by default) then the recovery will time out, fail, and retry repeatedly. We should disable the recovery monitor during this step.
server/src/main/java/org/elasticsearch/indices/recovery/PeerRecoveryTargetService.java
}
    }
    private static ActionListener<Void> createOrFinishListener(
        final RecoveryRef recoveryRef,
        final TransportChannel channel,
        final String action,
        final RecoveryTransportRequest request
    ) {
        return createOrFinishListener(recoveryRef, channel, action, request, nullVal -> TransportResponse.Empty.INSTANCE);
    }
    @Nullable
    private static ActionListener<Void> createOrFinishListener(
        final RecoveryRef recoveryRef,
        final TransportChannel channel,
        final String action,
        final RecoveryTransportRequest request,
        final CheckedFunction<Void, TransportResponse, Exception> responseFn
    ) {
        final RecoveryTarget recoveryTarget = recoveryRef.target();
        final ActionListener<Void> voidListener = new ChannelActionListener<>(channel, action, request).map(responseFn);
        final long requestSeqNo = request.requestSeqNo();
        final ActionListener<Void> listener;
        if (requestSeqNo != SequenceNumbers.UNASSIGNED_SEQ_NO) {
            listener = recoveryTarget.markRequestReceivedAndCreateListener(requestSeqNo, voidListener);
        } else {
            listener = voidListener;
        }
        return listener;
    }
    class RecoveryRunner extends AbstractRunnable {