def reserve(cls, reserve_id, reserve_data, block=False, block_timeout=90): if block: cursor_id = messenger.get_cursor_id('queue') doc = cls.collection.find_and_modify({ 'state': PENDING, 'reserve_id': reserve_id, 'reserve_data': None, }, {'$set': { 'reserve_data': reserve_data, }}, new=True) if not doc: return if block: for msg in messenger.subscribe('queue', cursor_id=cursor_id, timeout=block_timeout): try: if msg['message'] == [COMPLETE, doc['_id']]: return doc elif msg['message'] == [ERROR, doc['_id']]: raise QueueTaskError('Error occured running ' + 'queue task', { 'queue_id': doc['_id'], 'queue_type': doc['type'], }) except TypeError: pass logger.error('Blocking queue reserve timed out', { 'queue_id': doc['_id'], 'queue_type': doc['type'], }) return doc else: return doc
def reserve(cls, reserve_id, reserve_data, block=False, block_timeout=30): if block: cursor_id = messenger.get_cursor_id('queue') doc = cls.collection.find_and_modify({ 'state': PENDING, 'reserve_id': reserve_id, 'reserve_data': None, }, {'$set': { 'reserve_data': reserve_data, }}) if not doc: return if block: for msg in messenger.subscribe('queue', cursor_id=cursor_id, timeout=block_timeout): try: if msg['message'] == [COMPLETE, doc['_id']]: return doc elif msg['message'] == [ERROR, doc['_id']]: raise QueueTaskError('Error occured running ' + 'queue task', { 'queue_id': doc['_id'], 'queue_type': doc['type'], }) except TypeError: pass raise QueueTimeout('Blocking queue reserve timed out', { 'queue_id': doc['_id'], 'queue_type': doc['type'], }) else: return doc
def start(self, transaction=None, block=False, block_timeout=30): self.ttl_timestamp = utils.now() + \ datetime.timedelta(seconds=self.ttl) self.commit(transaction=transaction) if block: if transaction: raise TypeError('Cannot use transaction when blocking') cursor_id = messenger.get_cursor_id('queue') extra = {'queue_doc': self.export()} messenger.publish('queue', [PENDING, self.id], extra=extra, transaction=transaction) if block: last_update = time.time() while True: for msg in messenger.subscribe('queue', cursor_id=cursor_id, timeout=block_timeout): cursor_id = msg['_id'] try: if msg['message'] == [COMPLETE, self.id]: return elif msg['message'] == [UPDATE, self.id]: last_update = time.time() break elif msg['message'] == [ERROR, self.id]: raise QueueTaskError( 'Error occured running ' + 'queue task', { 'queue_id': self.id, 'queue_type': self.type, }) except TypeError: pass if (time.time() - last_update) >= block_timeout: raise QueueTimeout('Blocking queue timed out.', { 'queue_id': self.id, 'queue_type': self.type, })
def start(self, transaction=None, block=False, block_timeout=30): self.ttl_timestamp = utils.now() + \ datetime.timedelta(seconds=self.ttl) self.commit(transaction=transaction) if block: if transaction: raise TypeError('Cannot use transaction when blocking') cursor_id = messenger.get_cursor_id('queue') extra = { 'queue_doc': self.export() } messenger.publish('queue', [PENDING, self.id], extra=extra, transaction=transaction) if block: last_update = time.time() while True: for msg in messenger.subscribe('queue', cursor_id=cursor_id, timeout=block_timeout): cursor_id = msg['_id'] try: if msg['message'] == [COMPLETE, self.id]: return elif msg['message'] == [UPDATE, self.id]: last_update = time.time() break elif msg['message'] == [ERROR, self.id]: raise QueueTaskError('Error occured running ' + 'queue task', { 'queue_id': self.id, 'queue_type': self.type, }) except TypeError: pass if (time.time() - last_update) >= block_timeout: raise QueueTimeout('Blocking queue timed out.', { 'queue_id': self.id, 'queue_type': self.type, })
def get_cursor_id(self): return messenger.get_cursor_id('servers')