Beispiel #1
0
    def commit(self):
        """Store the new height and along with block hash."""

        self.abort_if_abci_chain_is_not_synced()

        data = self.block_txn_hash.encode('utf-8')

        # register a new block only when new transactions are received
        if self.block_txn_ids:
            self.bigchaindb.store_bulk_transactions(self.block_transactions)

        block = Block(app_hash=self.block_txn_hash,
                      height=self.new_height,
                      transactions=self.block_txn_ids)
        # NOTE: storing the block should be the last operation during commit
        # this effects crash recovery. Refer BEP#8 for details
        self.bigchaindb.store_block(block._asdict())

        logger.debug(
            'Commit-ing new block with hash: apphash=%s ,'
            'height=%s, txn ids=%s', data, self.new_height, self.block_txn_ids)

        if self.events_queue:
            event = Event(EventTypes.BLOCK_VALID, {
                'height': self.new_height,
                'transactions': self.block_transactions
            })
            self.events_queue.put(event)

        return ResponseCommit(data=data)
Beispiel #2
0
def test_event_handler():
    from bigchaindb.events import EventTypes, Event, Exchange

    # create and event
    event_data = {'msg': 'some data'}
    event = Event(EventTypes.BLOCK_VALID, event_data)

    # create the events pub sub
    exchange = Exchange()

    sub0 = exchange.get_subscriber_queue(EventTypes.BLOCK_VALID)
    sub1 = exchange.get_subscriber_queue(EventTypes.BLOCK_VALID
                                         | EventTypes.BLOCK_INVALID)
    # Subscribe to all events
    sub2 = exchange.get_subscriber_queue()
    sub3 = exchange.get_subscriber_queue(EventTypes.BLOCK_INVALID)

    # push and event to the queue
    exchange.dispatch(event)

    # get the event from the queue
    event_sub0 = sub0.get()
    event_sub1 = sub1.get()
    event_sub2 = sub2.get()

    assert event_sub0.type == event.type
    assert event_sub0.data == event.data

    assert event_sub1.type == event.type
    assert event_sub1.data == event.data

    assert event_sub2.type == event.type
    assert event_sub2.data == event.data

    assert sub3.qsize() == 0
Beispiel #3
0
    def handle_block_events(self, result, block_id):
        if self.event_handler:
            if result['status'] == self.bigchain.BLOCK_UNDECIDED:
                return
            elif result['status'] == self.bigchain.BLOCK_INVALID:
                event_type = EventTypes.BLOCK_INVALID
            elif result['status'] == self.bigchain.BLOCK_VALID:
                event_type = EventTypes.BLOCK_VALID

            event = Event(event_type, self.bigchain.get_block(block_id))
            self.event_handler.put_event(event)
Beispiel #4
0
def process_event(event_queue, event, stream_id):
    event_stream_id = stream_id + '#event'
    event = json.loads(event)

    if (event['id'] == event_stream_id and event['result']['query'] == 'tm.event=\'NewBlock\''):
        block = event['result']['data']['value']['block']
        block_id = block['header']['height']
        block_txs = block['data']['txs']

        # Only push non empty blocks
        if block_txs:
            block_txs = [decode_transaction_base64(txn) for txn in block_txs]
            new_block = {'height': block_id, 'transactions': block_txs}
            event = Event(EventTypes.BLOCK_VALID, new_block)
            event_queue.put(event)
Beispiel #5
0
def test_exchange_stops_with_poison_pill():
    from bigchaindb.events import EventTypes, Event, Exchange, POISON_PILL

    # create and event
    event_data = {'msg': 'some data'}
    event = Event(EventTypes.BLOCK_VALID, event_data)

    # create the events pub sub
    exchange = Exchange()

    publisher_queue = exchange.get_publisher_queue()

    # push and event to the queue
    publisher_queue.put(event)
    publisher_queue.put(POISON_PILL)
    exchange.run()

    assert publisher_queue.qsize() == 0
Beispiel #6
0
def tests_event_handler():
    from bigchaindb.events import (EventTypes, Event, EventHandler,
                                   setup_events_queue)

    # create and event
    event_data = {'msg': 'some data'}
    event = Event(EventTypes.BLOCK_VALID, event_data)
    # create the events queue
    events_queue = setup_events_queue()

    # create event handler
    event_handler = EventHandler(events_queue)

    # push and event to the queue
    event_handler.put_event(event)

    # get the event from the queue
    event_from_queue = event_handler.get_event()

    assert event_from_queue.type == event.type
    assert event_from_queue.data == event.data