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