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))