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
final long recoveryId;
        private final StartRecoveryRequest startRecoveryRequest;
        RecoveryRunner(long recoveryId) {
            this(recoveryId, null);
        }
        RecoveryRunner(long recoveryId, StartRecoveryRequest startRecoveryRequest) {
            this.recoveryId = recoveryId;
            this.startRecoveryRequest = startRecoveryRequest;
        }
        @Override
        public void onFailure(Exception e) {
            try (RecoveryRef recoveryRef = onGoingRecoveries.getRecovery(recoveryId)) {
                if (recoveryRef != null) {
                    logger.error(() -> "unexpected error during recovery [" + recoveryId + "], failing shard", e);
                    onGoingRecoveries.failRecovery(
                        recoveryId,
                        new RecoveryFailedException(recoveryRef.target().state(), "unexpected error", e),
                        true 
                    );
                } else {
                    logger.debug(() -> "unexpected error during recovery, but recovery id [" + recoveryId + "] is finished", e);
                }
            }
        }
        @Override
        public void doRun() {
            doRecovery(recoveryId, startRecoveryRequest);
        }
    }
    private class RecoveryResponseHandler implements TransportResponseHandler<RecoveryResponse> {