private CompletableFuture<Block> scheduleGetBlockFromPeers(
      final Optional<EthPeer> maybePreferredPeer,
      final long blockNumber,
      final Optional<Hash> maybeBlockHash) {
    final RetryingGetBlockFromPeersTask getBlockTask =
        RetryingGetBlockFromPeersTask.create(
            protocolSchedule,
            ethContext,
            config,
            metricsSystem,
            Math.max(1, ethContext.getEthPeers().peerCount()),
            maybeBlockHash,
            blockNumber);
    maybePreferredPeer.ifPresent(getBlockTask::assignPeer);

    var future =
        ethContext
            .getScheduler()
            .scheduleSyncWorkerTask(getBlockTask::run)
            .thenCompose(r -> importOrSavePendingBlock(r.getResult(), r.getPeer().nodeId()));

    ethContext.getScheduler().failAfterTimeout(future, getBlockTimeoutMillis);

    return future;
  }
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