'Executes a single pass, looking for objects to expire.
:param args: Extra args to fulfill the Daemon interface; this daemon
has no additional args.
:param kwargs: Extra keyword args to fulfill the Daemon interface; this
daemon accepts processes and process keyword args.
These will override the values from the config file if
provided.'

def run_once(self, *args, **kwargs):

    self.get_process_values(kwargs)
    pool = GreenPool(self.concurrency)
    containers_to_delete = set([])
    self.report_first_time = self.report_last_time = time()
    self.report_objects = 0
    try:
        self.logger.debug('Run    begin')
        (containers, objects) = self.swift.get_account_info(self.expiring_objects_account)
        self.logger.info((_('Pass    beginning;    %(containers)s    possible    containers;    %(objects)s    possible    objects') % {'containers': containers, 'objects': objects}))
        for (container, obj) in self.iter_cont_objs_to_expire():
            containers_to_delete.add(container)
            if (not obj):
                continue
            (timestamp, actual_obj) = obj.split('-', 1)
            timestamp = int(timestamp)
            if (timestamp > int(time())):
                break
            pool.spawn_n(self.delete_object, actual_obj, timestamp, container, obj)
        pool.waitall()
        for container in containers_to_delete:
            try:
                self.swift.delete_container(self.expiring_objects_account, container, acceptable_statuses=(2, HTTP_NOT_FOUND, HTTP_CONFLICT))
            except (Exception, Timeout) as err:
                self.logger.exception((_('Exception    while    deleting    container    %(container)s    %(err)s') % {'container': container, 'err': str(err)}))
        self.logger.debug('Run    end')
        self.report(final=True)
    except (Exception, Timeout):
        self.logger.exception(_('Unhandled    exception'))
