'Update the map of partition => [replicas] to be reassigned from
overweight drives without restriction, parts gathered from this method
may be placed back onto devices that are no better (or worse) than the
device from which they are gathered.
This method allows devices to flop around enough to unlock replicas
that would have otherwise potentially been locked because of
dispersion - it should be used as a last resort.
:param assign_parts: the map of partition => [replica] to update
:param start: offset into self.parts to begin search'

def _gather_parts_for_balance_forced(self, assign_parts, start, **kwargs):

    for offset in range(self.parts):
        part = ((start + offset) % self.parts)
        if (not self._can_part_move(part)):
            continue
        overweight_dev_replica = []
        for replica in self._replicas_for_part(part):
            dev_id = self._replica2part2dev[replica][part]
            if (dev_id == NONE_DEV):
                continue
            dev = self.devs[dev_id]
            if (dev['parts_wanted'] < 0):
                overweight_dev_replica.append((dev, replica))
        if (not overweight_dev_replica):
            continue
        overweight_dev_replica.sort(key=(lambda dr: dr[0]['parts_wanted']))
        (dev, replica) = overweight_dev_replica[0]
        dev['parts_wanted'] += 1
        dev['parts'] -= 1
        assign_parts[part].append(replica)
        self.logger.debug('Gathered    %d/%d    from    dev    %s    [weight    forced]', part, replica, pretty_dev(dev))
        self._replica2part2dev[replica][part] = NONE_DEV
        self._set_part_moved(part)
