def complete(self, fid, *args): sink = args[0] sink.stream = False if sink.delivery == 'streaming': log.debug('Sending end stream signal after {}'.format(sink.delivery)) sink.delivery = 'sent' reply((), headers={'state': 'end'}, **sink.recipient) log.info('Stream of fragment {} for request {} is done'.format(fid, sink.request_id))
def __reply_accepted(self): graph = build_reply(accepted_template, self.request.message_id) reply(graph.serialize(format='turtle'), exchange='sdh', routing_key='curator.response.{}'.format(self.request.submitted_by), **self.request.broker) if self.sink.delivery is None: self.sink.delivery = 'accepted' log.info('Request {} was accepted'.format(self.request_id))
def _reply_failure(self, reason=None): try: graph = build_reply(failure_template, self.request.message_id, reason) reply(graph.serialize(format='turtle'), exchange='sdh', routing_key='curator.response.{}'.format(self.request.submitted_by), **self.request.broker) log.info('Notified failure of request {} due to: {}'.format(self.request_id, reason)) except KeyError: # Delivery channel data may be invalid pass
def __deliver_response(rid): response = None try: response = build_response(rid) delivery_state = response.sink.delivery if delivery_state == 'ready': messages = response.build() # The creation of a response object may change the corresponding request delivery state # (mixing, streaming, etc). The thing is that it was 'ready' before, # so it should be something prepared to deliver. message, headers = messages.next() # Actually, this is the trigger reply(message, headers=headers, **response.sink.recipient) n_messages = 1 deliver_weight = len(str(message)) deliver_delta = deliver_weight for (message, headers) in messages: reply(message, headers=headers, **response.sink.recipient) n_messages += 1 deliver_weight += len(str(message)) deliver_delta += deliver_weight if deliver_delta > 1000: deliver_delta = 0 log.info('Delivering response of request {} [{} kB]'.format(rid, deliver_weight / 1000.0)) deliver_weight /= 1000.0 log.info('{} messages delivered for request {} [{} kB]'.format(n_messages, rid, deliver_weight)) elif delivery_state == 'accepted': log.error('Request {} should not be marked as deliver-ready, its state is inconsistent'.format(rid)) else: log.info('Response of request {} is being delivered by other means...'.format(rid)) r.srem('deliveries:ready', rid) except StopIteration: # There was nothing prepared to deliver (Its state may have changed to # 'streaming') r.srem('deliveries:ready', rid) except (EnvironmentError, AttributeError, Exception), e: r.srem('deliveries:ready', rid) traceback.print_exc() log.warning(e.message) if response is not None: log.error('Force remove of request {} due to a delivery error'.format(rid)) response.sink.remove() else: log.error("Couldn't remove request {}".format(rid))