private int concurDataSizeRecv(Map<Integer, Integer> observed, Iterator<XORFragment> left) throws InsufficientFragmentsException {
        if(left.hasNext()) {
            // Process the next fragment
            XORFragment frag = left.next();
            int fragValue = frag.getClusterDataSize();
            Integer count = observed.get(fragValue);
            if(count == null) {
                // This is the first observation of this value
                observed.put(fragValue, 1);
            } else {
                // Increase the count of this observation
                ++count;
                //observed.put(fragValue, count);   // Not necessary since count is a reference to the Integer object already in the map
            }

            // Proceed with recursion
            return concurDataSizeRecv(observed, left);
        } else {
            // There are no more fragments to inspect

            // Find the most observed value
            Map.Entry<Integer, Integer> winner = null;
            for(Map.Entry<Integer, Integer> observation : observed.entrySet()) {
                if(winner == null) {
                    winner = observation;
                } else if(observation.getValue() > winner.getValue()) {
                    winner = observation;
                }
                // else: Do nothing and proceed to next map entry
            }

            // We're done here
            if(winner == null) {
                // There were no fragments in the cluster to begin with!
                throw new InsufficientFragmentsException(0);
            } else {
                // This is the end of recursion
                return winner.getKey();
            }
        }
    }