@Override
  public void handleBlockTimerExpiry(final ConsensusRoundIdentifier roundIdentifier) {
    if (currentRound.isPresent()) {
      // It is possible for the block timer to take longer than it should due to the precision of
      // the timer in Java and the OS. This means occasionally the proposal can arrive before the
      // block timer expiry and hence the round has already been set. There is no negative impact
      // on the protocol in this case.
      return;
    }

    startNewRound(0);

    final QbftRound qbftRound = currentRound.get();

    logValidatorChanges(qbftRound);

    if (roundIdentifier.equals(qbftRound.getRoundIdentifier())) {
      buildBlockAndMaybePropose(roundIdentifier, qbftRound);
    } else {
      LOG.trace(
          "Block timer expired for a round ({}) other than current ({})",
          roundIdentifier,
          qbftRound.getRoundIdentifier());
    }
  }
Instantiates a new Qbft block height manager. Secondary constructor with early round change
option.

@param parentHeader the parent header
@param finalState the final state
@param roundChangeManager the round change manager
@param qbftRoundFactory the qbft round factory
@param clock the clock
@param messageValidatorFactory the message validator factory
@param messageFactory the message factory
@param validatorProvider the validator provider
@param isEarlyRoundChangeEnabled enable round change when f+1 RC messages are received
consensus/qbft-core/src/main/java/org/hyperledger/besu/consensus/qbft/core/statemachine/QbftBlockHeightManager.java