Ejemplo n.º 1
0
    def get_transaction_metadata(self, app, txid):
        """ Fetch transaction state.

    Args:
      app: A string specifying an application ID.
      txid: An integer specifying a transaction ID.
    Returns:
      A dictionary containing transaction state.
    """
        select = (
            'SELECT namespace, operation, path, start_time, is_xg, in_progress, '
            '       entity, task '
            'FROM transactions '
            'WHERE txid_hash = %(txid_hash)s ')
        parameters = {'txid_hash': tx_partition(app, txid)}
        try:
            results = yield self.tornado_cassandra.execute(select, parameters)
        except dbconstants.TRANSIENT_CASSANDRA_ERRORS:
            message = 'Exception while inserting entities in a transaction'
            logger.exception(message)
            raise AppScaleDBConnectionError(message)

        metadata = {'puts': {}, 'deletes': [], 'tasks': [], 'reads': set()}
        for result in results:
            if result.operation == TxnActions.START:
                metadata['start'] = result.start_time
                metadata['is_xg'] = result.is_xg
                metadata['in_progress'] = set()
                if metadata['in_progress'] is not None:
                    metadata['in_progress'] = set(
                        struct.unpack('q' * int(len(result.in_progress) / 8),
                                      result.in_progress))
            if result.operation == TxnActions.MUTATE:
                key = create_key(app, result.namespace, result.path)
                if result.entity is None:
                    metadata['deletes'].append(key)
                else:
                    metadata['puts'][key.Encode()] = result.entity
            if result.operation == TxnActions.GET:
                group_key = create_key(app, result.namespace, result.path)
                metadata['reads'].add(group_key.Encode())
            if result.operation == TxnActions.ENQUEUE_TASK:
                service_id, version_id, task_pb = result.task.split('_', 2)
                task_metadata = {
                    'service_id': service_id,
                    'version_id': version_id,
                    'task': taskqueue_service_pb.TaskQueueAddRequest(task_pb)
                }
                metadata['tasks'].append(task_metadata)
        raise gen.Return(metadata)
Ejemplo n.º 2
0
  def get_transaction_metadata(self, app, txid):
    """ Fetch transaction state.

    Args:
      app: A string specifying an application ID.
      txid: An integer specifying a transaction ID.
    Returns:
      A dictionary containing transaction state.
    """
    select = (
      'SELECT namespace, operation, path, start_time, is_xg, in_progress, '
      '       entity, task '
      'FROM transactions '
      'WHERE txid_hash = %(txid_hash)s '
    )
    parameters = {'txid_hash': tx_partition(app, txid)}
    try:
      results = yield self.tornado_cassandra.execute(select, parameters)
    except dbconstants.TRANSIENT_CASSANDRA_ERRORS:
      message = 'Exception while inserting entities in a transaction'
      logger.exception(message)
      raise AppScaleDBConnectionError(message)

    metadata = {'puts': {}, 'deletes': [], 'tasks': [], 'reads': set()}
    for result in results:
      if result.operation == TxnActions.START:
        metadata['start'] = result.start_time
        metadata['is_xg'] = result.is_xg
        metadata['in_progress'] = set()
        if metadata['in_progress'] is not None:
          metadata['in_progress'] = set(
            struct.unpack('q' * int(len(result.in_progress) / 8),
                          result.in_progress))
      if result.operation == TxnActions.MUTATE:
        key = create_key(app, result.namespace, result.path)
        if result.entity is None:
          metadata['deletes'].append(key)
        else:
          metadata['puts'][key.Encode()] = result.entity
      if result.operation == TxnActions.GET:
        group_key = create_key(app, result.namespace, result.path)
        metadata['reads'].add(group_key.Encode())
      if result.operation == TxnActions.ENQUEUE_TASK:
        service_id, version_id, task_pb = result.task.split('_', 2)
        task_metadata = {
          'service_id': service_id,
          'version_id': version_id,
          'task': taskqueue_service_pb.TaskQueueAddRequest(task_pb)}
        metadata['tasks'].append(task_metadata)
    raise gen.Return(metadata)