@Override public CH create(Hash hashFunction, int numOwners, int numSegments, List<Address> members, Map<Address, Float> capacityFactors) { assertNumberOfSegments(numSegments); List<Address>[] segmentOwners = assignSegments(numSegments, numOwners, members); return create(hashFunction, numOwners, numSegments, members, capacityFactors, segmentOwners, false); }
@Override public CH updateMembers(CH baseCH, List<Address> newMembers, Map<Address, Float> capacityFactors) { assertNumberOfSegments(baseCH.getNumSegments()); final int numOwners = baseCH.getNumOwners(); List<Address>[] segmentOwners = new List[numSegments]; List<Address>[] balancedOwners = null; for (int i = 0; i < numSegments; i++) { List<Address> owners = new ArrayList<>(baseCH.locateOwnersForSegment(i)); owners.retainAll(newMembers); // updateMembers should only add new owners if there are no owners left and the trait requires a primary owner if (owners.isEmpty() && trait.requiresPrimaryOwner()) { if (balancedOwners == null) { balancedOwners = assignSegments(numSegments, numOwners, newMembers); } owners = balancedOwners[i]; } segmentOwners[i] = owners; } CH updated = create(baseCH.getHashFunction(), numOwners, numSegments, newMembers, capacityFactors, segmentOwners, false); return baseCH.equals(updated) ? baseCH : updated; }
@Override public CH rebalance(CH baseCH) { List<Address>[] owners = assignSegments(baseCH.getNumSegments(), baseCH.getNumOwners(), baseCH.getMembers()); CH rebalanced = create(baseCH.getHashFunction(), baseCH.getNumOwners(), baseCH.getNumSegments(), baseCH.getMembers(), baseCH.getCapacityFactors(), owners, true); return baseCH.equals(rebalanced) ? baseCH : rebalanced; }