'Periodic task to send updates for a number of instances to
parent cells.
On every run of the periodic task, we will attempt to sync
\'CONF.cells.instance_update_num_instances\' number of instances.
When we get the list of instances, we shuffle them so that multiple
nova-cells services aren\'t attempting to sync the same instances
in lockstep.
If CONF.cells.instance_update_at_threshold is set, only attempt
to sync instances that have been updated recently.  The CONF
setting defines the maximum number of seconds old the updated_at
can be.  Ie, a threshold of 3600 means to only update instances
that have modified in the last hour.'

@periodic_task.periodic_task
def _heal_instances(self, ctxt):

    if (not self.state_manager.get_parent_cells()):
        return
    info = {'updated_list': False}
    def _next_instance():
        try:
            instance = next(self.instances_to_heal)
        except StopIteration:
            if info['updated_list']:
                return
            threshold = CONF.cells.instance_updated_at_threshold
            updated_since = None
            if (threshold > 0):
                updated_since = (timeutils.utcnow() - datetime.timedelta(seconds=threshold))
            self.instances_to_heal = cells_utils.get_instances_to_sync(ctxt, updated_since=updated_since, shuffle=True, uuids_only=True)
            info['updated_list'] = True
            try:
                instance = next(self.instances_to_heal)
            except StopIteration:
                return
        return instance
    rd_context = ctxt.elevated(read_deleted='yes')
    for i in range(CONF.cells.instance_update_num_instances):
        while True:
            time.sleep(0)
            instance_uuid = _next_instance()
            if (not instance_uuid):
                return
            try:
                instance = objects.Instance.get_by_uuid(rd_context, instance_uuid)
            except exception.InstanceNotFound:
                continue
            self._sync_instance(ctxt, instance)
            break
