Ejemplo n.º 1
0
    def stats(self, name, project=None):
        if not self.exists(name, project=project):
            raise errors.QueueDoesNotExist(name, project)

        q_id = utils.scope_queue_name(name, project)
        q_info = self._client.hgetall(q_id)

        claimed = int(q_info['cl'])
        total = int(q_info['c'])
        msg_ctrl = self.driver.message_controller
        now = timeutils.utcnow_ts()

        message_stats = {
            'claimed': claimed,
            'free': total - claimed,
            'total': total
        }

        try:
            newest = msg_ctrl.first(name, project, 1)
            oldest = msg_ctrl.first(name, project, -1)
        except errors.QueueIsEmpty:
            pass
        else:
            message_stats['newest'] = utils.stat_message(newest, now)
            message_stats['oldest'] = utils.stat_message(oldest, now)

        return {'messages': message_stats}
Ejemplo n.º 2
0
    def get_metadata(self, name, project=None):
        if not self.exists(name, project):
            raise errors.QueueDoesNotExist(name, project)

        q_id = utils.scope_queue_name(name, project)
        metadata = self._get_queue_info(q_id, 'm')
        return {} if utils.is_metadata_empty(metadata) else metadata
Ejemplo n.º 3
0
def get_qid(driver, queue, project):
    sel = sa.sql.select([tables.Queues.c.id],
                        sa.and_(tables.Queues.c.project == project,
                                tables.Queues.c.name == queue))
    try:
        return driver.get(sel)[0]
    except NoResult:
        raise errors.QueueDoesNotExist(queue, project)
Ejemplo n.º 4
0
 def set_metadata(self, name, metadata, project=None):
     target = self._lookup(name, project)
     if target:
         control = target.queue_controller
         return control.set_metadata(name,
                                     metadata=metadata,
                                     project=project)
     raise errors.QueueDoesNotExist(name, project)
Ejemplo n.º 5
0
    def delete(self, name, project=None):
        if not self.exists(name, project):
            raise errors.QueueDoesNotExist(name, project)

        q_name = utils.scope_queue_name(name, project)
        project_bkt = self._get_project_bkt(project)
        # Delete ensures the removal of the queue from the
        # project bucket.
        project_bkt.delete(q_name)
Ejemplo n.º 6
0
    def get_metadata(self, name, project=None):
        if not self.exists(name, project):
            raise errors.QueueDoesNotExist(name, project)

        q_name = utils.scope_queue_name(name, project)
        project_bkt = self._get_project_bkt(project)

        q_info = project_bkt.get(q_name).data
        return q_info['m']
Ejemplo n.º 7
0
 def post(self, queue, project, messages, client_uuid):
     target = self._lookup(queue, project)
     if target:
         control = target.message_controller
         return control.post(queue,
                             project=project,
                             messages=messages,
                             client_uuid=client_uuid)
     raise errors.QueueDoesNotExist(project, queue)
Ejemplo n.º 8
0
def get_qid(driver, queue, project):
    try:
        return driver.get(
            '''
            select id from Queues
             where project = ? and name = ?''', project, queue)[0]

    except NoResult:
        raise errors.QueueDoesNotExist(queue, project)
Ejemplo n.º 9
0
    def get(self, queue, message_id, project=None):
        if not self._queue_controller.exists(queue, project):
            raise errors.QueueDoesNotExist(queue, project)

        if not self._exists(queue, project, message_id):
            raise errors.MessageDoesNotExist(message_id, queue, project)

        msg = self._get(message_id)
        return utils.basic_message(msg, timeutils.utcnow_ts())
Ejemplo n.º 10
0
    def list(self,
             queue,
             project=None,
             marker=None,
             limit=storage.DEFAULT_MESSAGES_PER_PAGE,
             echo=True,
             client_uuid=None,
             include_claimed=False):

        if not self._queue_controller.exists(queue, project):
            raise errors.QueueDoesNotExist(queue, project)

        messages_set_id = utils.scope_messages_set(queue, project,
                                                   QUEUE_MESSAGES_LIST_SUFFIX)
        client = self._client
        start = client.zrank(messages_set_id, marker) or 0
        # In a pooled environment, the default values are not being set.
        limit = limit or storage.DEFAULT_MESSAGES_PER_CLAIM
        message_ids = client.zrange(messages_set_id, start, start + limit)
        filters = collections.defaultdict(dict)

        # Build a list of filters for checking the following:
        # 1. Message is claimed.
        # 2. echo message to the client.
        if not include_claimed:
            filters['claimed_filter']['f'] = utils.msg_claimed_filter
            filters['claimed_filter']['f.v'] = timeutils.utcnow_ts()

        if not echo:
            filters['echo_filter']['f'] = utils.msg_echo_filter
            filters['echo_filter']['f.v'] = client_uuid

        marker = {}

        def _it(message_ids, filters={}):
            """Create a filtered iterator of messages.

                The function accepts a list of filters to be filtered
                before the the message can be included as a part of the reply.
            """
            now = timeutils.utcnow_ts()

            for message_id in message_ids:
                message = client.hgetall(message_id)
                if message:
                    for filter in six.itervalues(filters):
                        filter_func = filter['f']
                        filter_val = filter['f.v']
                        if filter_func(message, filter_val):
                            break
                    else:
                        marker['next'] = message_id
                        yield utils.basic_message(message, now)

        yield _it(message_ids, filters)
        yield marker['next']
Ejemplo n.º 11
0
    def get_metadata(self, name, project):
        if project is None:
            project = ''

        try:
            sel = sa.sql.select([tables.Queues.c.metadata],
                                sa.and_(tables.Queues.c.project == project,
                                        tables.Queues.c.name == name))
            return json.loads(self.driver.get(sel)[0])
        except utils.NoResult:
            raise errors.QueueDoesNotExist(name, project)
Ejemplo n.º 12
0
    def bulk_delete(self, queue, message_ids, project=None):
        if not self._queue_controller.exists(queue, project):
            raise errors.QueueDoesNotExist(queue, project)

        messages_set_id = utils.scope_messages_set(queue, project,
                                                   QUEUE_MESSAGES_LIST_SUFFIX)
        pipe = self._pipeline

        for message_id in message_ids:
            pipe.delete(message_id).zrem(messages_set_id, message_id)

        pipe.execute()
Ejemplo n.º 13
0
    def set_metadata(self, name, metadata, project=None):
        if not self.exists(name, project):
            raise errors.QueueDoesNotExist(name, project)

        q_id = utils.scope_queue_name(name, project)
        q_info = {'c': 1, 'cl': 0, 'm': metadata, 't': timeutils.utcnow_ts()}

        if self.exists(name, project):
            q_info['c'] = self._get_queue_info(q_id, 'c')
            q_info['cl'] = self._get_queue_info(q_id, 'cl')

        self._client.hmset(q_id, q_info)
Ejemplo n.º 14
0
    def get_metadata(self, name, project):
        if project is None:
            project = ''

        try:
            return self.driver.get(
                '''
                select metadata from Queues
                 where project = ? and name = ?''', project, name)[0]

        except utils.NoResult:
            raise errors.QueueDoesNotExist(name, project)
Ejemplo n.º 15
0
    def set_metadata(self, name, metadata, project):
        if project is None:
            project = ''

        self.driver.run(
            '''
            update Queues
               set metadata = ?
             where project = ? and name = ?
        ''', self.driver.pack(metadata), project, name)

        if not self.driver.affected:
            raise errors.QueueDoesNotExist(name, project)
Ejemplo n.º 16
0
    def delete(self, name, project=None):
        # Note(prashanthr_): Pipelining is used to ensure no race conditions
        # occur.
        if not self.exists(name, project):
            raise errors.QueueDoesNotExist(name, project)

        q_id = utils.scope_queue_name(name, project)
        qset_id = utils.scope_queue_name(QUEUES_SET_STORE_NAME, project)

        pipe = self._pipeline

        pipe.zrem(qset_id, q_id)
        pipe.delete(q_id)
        self.driver.message_controller._delete_queue_messages(name, project)
        pipe.execute()
Ejemplo n.º 17
0
    def set_metadata(self, name, metadata, project=None):
        if not self.exists(name, project):
            raise errors.QueueDoesNotExist(name, project)

        q_name = utils.scope_queue_name(name, project)
        project_bkt = self._get_project_bkt(project)

        q_info = project_bkt.get(q_name)
        q_data = q_info.data
        # Set the new metadata.
        q_data['m'] = metadata
        q_data['t'] = timeutils.utcnow_ts()
        # Store the back into the bucket.
        # Note(prashanthr_): Check if re-indexing is needed.
        q_info.add_index(QUEUE_MODTIME_INDEX, q_data['t'])
        q_info.store()
Ejemplo n.º 18
0
    def set_metadata(self, name, metadata, project):
        if project is None:
            project = ''

        update = tables.Queues.update().\
            where(sa.and_(
                tables.Queues.c.project == project,
                tables.Queues.c.name == name)).\
            values(metadata=json.dumps(metadata))
        res = self.driver.run(update)

        try:
            if res.rowcount != 1:
                raise errors.QueueDoesNotExist(name, project)
        finally:
            res.close()
Ejemplo n.º 19
0
    def bulk_get(self, queue, message_ids, project=None):
        # Note(prashanthr_): Pipeline is not used here as atomic guarantee
        # is not required, but can be used for performance.
        client = self._client
        if not self._queue_controller.exists(queue, project):
            raise errors.QueueDoesNotExist(queue, project)

        def _it(message_ids):
            now = timeutils.utcnow_ts()

            for message_id in message_ids:
                message = client.hgetall(message_id)
                if message:
                    yield utils.basic_message(message, now)

        return _it(message_ids)
Ejemplo n.º 20
0
    def post(self, queue, messages, client_uuid, project=None):
        if not self._queue_controller.exists(queue, project):
            raise errors.QueueDoesNotExist(queue, project)

        messages_set_id = utils.scope_messages_set(queue, project,
                                                   QUEUE_MESSAGES_LIST_SUFFIX)

        now = timeutils.utcnow_ts()
        now_dt = datetime.datetime.utcfromtimestamp(now)
        message_ids = []
        num_messages = self._get_count(messages_set_id)
        prepared_messages = [{
            'id':
            utils.generate_uuid(),
            't':
            message['ttl'],
            'e':
            now_dt + datetime.timedelta(seconds=message['ttl']),
            'u':
            client_uuid,
            'c':
            None,
            'k':
            num_messages + index,
            'c.e':
            now,
            'b':
            message['body'] if 'body' in message else {},
        } for index, message in enumerate(messages)]

        pipe = self._pipeline
        self._queue_controller._inc_counter(queue, project, len(messages))

        for message in prepared_messages:
            m_id = message['id']
            message_ids.append(m_id)
            pipe.zadd(messages_set_id, message['c.e'], m_id)
            pipe.hmset(m_id, message)

        pipe.execute()
        return message_ids
Ejemplo n.º 21
0
    def delete(self, queue, message_id, project=None, claim=None):
        messages_set_id = utils.scope_messages_set(queue, project,
                                                   QUEUE_MESSAGES_LIST_SUFFIX)
        pipe = self._pipeline
        if not self._queue_controller.exists(queue, project):
            raise errors.QueueDoesNotExist(queue, project)

        if not self._exists(queue, project, message_id):
            raise errors.MessageDoesNotExist(message_id, queue, project)

        now = timeutils.utcnow_ts()
        message = self._get(message_id)
        msg_claim = message['c']

        is_claimed = (msg_claim is not 'None' and int(message['c.e']) > now)

        if claim is None:
            if is_claimed:
                raise errors.MessageIsClaimed(message_id)
        else:
            if msg_claim != claim:
                raise errors.MessageIsClaimedBy(message_id, msg_claim)

        pipe.delete(message_id).zrem(messages_set_id, message_id).execute()
Ejemplo n.º 22
0
 def get(self, queue, message_id, project):
     target = self._lookup(queue, project)
     if target:
         control = target.message_controller
         return control.get(queue, message_id=message_id, project=project)
     raise errors.QueueDoesNotExist(project, queue)
Ejemplo n.º 23
0
 def stats(self, name, project=None):
     target = self._lookup(name, project)
     if target:
         control = target.queue_controller
         return control.stats(name, project=project)
     raise errors.QueueDoesNotExist(name, project)
Ejemplo n.º 24
0
 def set_metadata(self, name, metadata, project=None):
     key = self._queue(project, name)
     if not self._db.exists(key):
         raise errors.QueueDoesNotExist(name, project)
     self._db.hset(key, 'm', msgpack.dumps(metadata))