public synchronized void startTimer(
      final ConsensusRoundIdentifier round, final Supplier<Long> headerTimestamp) {
    cancelTimer();

    final long expiryTime;

    // Experimental option for test scenarios only. Not for production use.
    final long blockPeriodMilliseconds =
        forksSchedule.getFork(round.getSequenceNumber()).getValue().getBlockPeriodMilliseconds();
    if (blockPeriodMilliseconds > 0) {
      // Experimental mode for setting < 1 second block periods e.g. for CI/CD pipelines
      // running tests against Besu
      expiryTime = clock.millis() + blockPeriodMilliseconds;
      LOG.warn(
          "Test-mode only xblockperiodmilliseconds has been set to {} millisecond blocks. Do not use in a production system.",
          blockPeriodMilliseconds);
    } else {
      // absolute time when the timer is supposed to expire
      final int currentBlockPeriodSeconds =
          forksSchedule.getFork(round.getSequenceNumber()).getValue().getBlockPeriodSeconds();
      final long minimumTimeBetweenBlocksMillis = currentBlockPeriodSeconds * 1000L;
      expiryTime = headerTimestamp.get() * 1_000 + minimumTimeBetweenBlocksMillis;
    }

    setBlockTimes(round);

    startTimer(round, expiryTime);
  }
Starts a timer for the supplied round cancelling any previously active block timer

@param round The round identifier which this timer is tracking
@param headerTimestamp The timestamp from the of the chain head header
consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BlockTimer.java