private CompletableFuture<Block> maybeRepeatGetBlock(
      final long blockNumber, final Optional<Hash> maybeBlockHash) {
    final MutableBlockchain blockchain = protocolContext.getBlockchain();
    final Optional<Block> maybeBlock =
        maybeBlockHash
            .map(hash -> blockchain.getBlockByHash(hash))
            .orElseGet(() -> blockchain.getBlockByNumber(blockNumber));

    // check if we got this block by other means
    if (maybeBlock.isPresent()) {
      final Block block = maybeBlock.get();
      LOG.atDebug()
          .setMessage("No need to retry to get block {} since it is already present")
          .addArgument(block::toLogString)
          .log();
      return CompletableFuture.completedFuture(block);
    }

    final long localChainHeight = blockchain.getChainHeadBlockNumber();
    final long bestChainHeight = syncState.bestChainHeight(localChainHeight);
    if (!shouldImportBlockAtHeight(blockNumber, localChainHeight, bestChainHeight)) {
      LOG.atDebug()
          .setMessage("Not retrying to get block {} since we are too far from local chain head {}")
          .addArgument(() -> logBlockNumberMaybeHash(blockNumber, maybeBlockHash))
          .addArgument(blockchain.getChainHead()::toLogString)
          .log();
      return CompletableFuture.completedFuture(null);
    }

    LOG.atDebug()
        .setMessage("Retrying to get block {}")
        .addArgument(() -> logBlockNumberMaybeHash(blockNumber, maybeBlockHash))
        .log();

    return ethContext
        .getScheduler()
        .scheduleSyncWorkerTask(
            () -> repeatableGetBlockFromPeer(Optional.empty(), blockNumber, maybeBlockHash));
  }
Process pending Children if any

@param block the block to process the children
@return true if block has any pending child
ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/BlockPropagationManager.java