public synchronized void startTimer(final ConsensusRoundIdentifier round) {
    cancelTimer();

    final long expiryTime =
        baseExpiryPeriod.toMillis() * (long) Math.pow(2, round.getRoundNumber());

    final Runnable newTimerRunnable = () -> queue.add(new RoundExpiry(round));

    final ScheduledFuture<?> newTimerTask =
        bftExecutors.scheduleTask(newTimerRunnable, expiryTime, TimeUnit.MILLISECONDS);

    // Once we are up to round 2 start logging round expiries
    if (round.getRoundNumber() >= 2) {
      LOG.info(
          "Moved to round {} which will expire in {} seconds",
          round.getRoundNumber(),
          (expiryTime / 1000));
    }

    currentTimerTask = Optional.of(newTimerTask);
  }
Starts a timer for the supplied round cancelling any previously active round timer

@param round The round identifier which this timer is tracking
consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/RoundTimer.java