@Override @Nullable public WorkerNetAddress getWorkerForNextBlock(Iterable<BlockWorkerInfo> workerInfoList, long blockSizeBytes) { List<BlockWorkerInfo> shuffledWorkers = Lists.newArrayList(workerInfoList); Collections.shuffle(shuffledWorkers); // Workers must have enough capacity to hold the block. List<BlockWorkerInfo> candidateWorkers = shuffledWorkers.stream() .filter(worker -> worker.getCapacityBytes() >= blockSizeBytes) .collect(Collectors.toList()); // Try finding a worker based on nearest tiered identity. List<TieredIdentity> identities = candidateWorkers.stream() .map(worker -> worker.getNetAddress().getTieredIdentity()) .filter(Objects::nonNull) .collect(Collectors.toList()); Optional<TieredIdentity> nearest = TieredIdentityUtils.nearest(mTieredIdentity, identities, mCompareNodeIps); if (!nearest.isPresent()) { return null; } // Map back to the worker with the nearest tiered identity. return candidateWorkers.stream() .filter(worker -> worker.getNetAddress().getTieredIdentity().equals(nearest.get())) .map(worker -> worker.getNetAddress()) .findFirst().orElse(null); }
if (nearest.isPresent()) { dataSource = locations.stream().map(BlockLocation::getWorkerAddress) .filter(addr -> addr.getTieredIdentity().equals(nearest.get())).findFirst().get(); if (mTieredIdentity.getTier(0).getTierName().equals(Constants.LOCALITY_NODE) && mTieredIdentity.topTiersMatch(nearest.get())) {