'Generator to get extra nodes for a partition for hinted handoff.
The handoff nodes will try to be in zones other than the
primary zones, will take into account the device weights, and
will usually keep the same sequences of handoffs even with
ring changes.
:param part: partition to get handoff nodes for
:returns: generator of node dicts
See :func:`get_nodes` for a description of the node dicts.'

def get_more_nodes(self, part):

    if (time() > self._rtime):
        self._reload()
    primary_nodes = self._get_part_nodes(part)
    used = set((d['id'] for d in primary_nodes))
    same_regions = set((d['region'] for d in primary_nodes))
    same_zones = set(((d['region'], d['zone']) for d in primary_nodes))
    same_ips = set(((d['region'], d['zone'], d['ip']) for d in primary_nodes))
    parts = len(self._replica2part2dev_id[0])
    start = (struct.unpack_from('>I', md5(str(part)).digest())[0] >> self._part_shift)
    inc = (int((parts / 65536)) or 1)
    hit_all_regions = (len(same_regions) == self._num_regions)
    for handoff_part in chain(range(start, parts, inc), range((inc - ((parts - start) % inc)), start, inc)):
        if hit_all_regions:
            break
        for part2dev_id in self._replica2part2dev_id:
            if (handoff_part < len(part2dev_id)):
                dev_id = part2dev_id[handoff_part]
                dev = self._devs[dev_id]
                region = dev['region']
                if ((dev_id not in used) and (region not in same_regions)):
                    (yield dev)
                    used.add(dev_id)
                    same_regions.add(region)
                    zone = dev['zone']
                    ip = (region, zone, dev['ip'])
                    same_zones.add((region, zone))
                    same_ips.add(ip)
                    if (len(same_regions) == self._num_regions):
                        hit_all_regions = True
                        break
    hit_all_zones = (len(same_zones) == self._num_zones)
    for handoff_part in chain(range(start, parts, inc), range((inc - ((parts - start) % inc)), start, inc)):
        if hit_all_zones:
            break
        for part2dev_id in self._replica2part2dev_id:
            if (handoff_part < len(part2dev_id)):
                dev_id = part2dev_id[handoff_part]
                dev = self._devs[dev_id]
                zone = (dev['region'], dev['zone'])
                if ((dev_id not in used) and (zone not in same_zones)):
                    (yield dev)
                    used.add(dev_id)
                    same_zones.add(zone)
                    ip = (zone + (dev['ip'],))
                    same_ips.add(ip)
                    if (len(same_zones) == self._num_zones):
                        hit_all_zones = True
                        break
    hit_all_ips = (len(same_ips) == self._num_ips)
    for handoff_part in chain(range(start, parts, inc), range((inc - ((parts - start) % inc)), start, inc)):
        if hit_all_ips:
            break
        for part2dev_id in self._replica2part2dev_id:
            if (handoff_part < len(part2dev_id)):
                dev_id = part2dev_id[handoff_part]
                dev = self._devs[dev_id]
                ip = (dev['region'], dev['zone'], dev['ip'])
                if ((dev_id not in used) and (ip not in same_ips)):
                    (yield dev)
                    used.add(dev_id)
                    same_ips.add(ip)
                    if (len(same_ips) == self._num_ips):
                        hit_all_ips = True
                        break
    hit_all_devs = (len(used) == self._num_devs)
    for handoff_part in chain(range(start, parts, inc), range((inc - ((parts - start) % inc)), start, inc)):
        if hit_all_devs:
            break
        for part2dev_id in self._replica2part2dev_id:
            if (handoff_part < len(part2dev_id)):
                dev_id = part2dev_id[handoff_part]
                if (dev_id not in used):
                    (yield self._devs[dev_id])
                    used.add(dev_id)
                    if (len(used) == self._num_devs):
                        hit_all_devs = True
                        break
