def abort(self): """ See ITransaction. """ if self._savepoint2index: self._invalidate_all_savepoints() self._synchronizers.map(lambda s: s.beforeCompletion(self)) try: t = None v = None tb = None for rm in self._resources: try: rm.abort(self) except: if tb is None: t, v, tb = sys.exc_info() self.log.error("Failed to abort resource manager: %s", rm, exc_info=sys.exc_info()) if self._manager: self._manager.free(self) self._synchronizers.map(lambda s: s.afterCompletion(self)) self.log.debug("abort") if tb is not None: reraise(t, v, tb) finally: del t, v, tb
def abort(self): """ See ITransaction. """ if self._savepoint2index: self._invalidate_all_savepoints() self._synchronizers.map(lambda s: s.beforeCompletion(self)) try: t = None v = None tb = None for rm in self._resources: try: rm.abort(self) except: if tb is None: t, v, tb = sys.exc_info() self.log.error("Failed to abort resource manager: %s", rm, exc_info=sys.exc_info()) self._free() self._synchronizers.map(lambda s: s.afterCompletion(self)) self.log.debug("abort") if tb is not None: reraise(t, v, tb) finally: del t, v, tb
async def acommit(self): """See ITransaction.""" if self.status is Status.DOOMED: raise interfaces.DoomedTransaction( 'transaction doomed, cannot commit') if self._savepoint2index: self._invalidate_all_savepoints() if self.status is Status.COMMITFAILED: self._prior_operation_failed() # doesn't return await self._acallBeforeCommitHooks() self._synchronizers.map(lambda s: s.beforeCompletion(self)) self.status = Status.COMMITTING try: self._commitResources() self.status = Status.COMMITTED except: t = None v = None tb = None try: t, v, tb = self._saveAndGetCommitishError() await self._acallAfterCommitHooks(status=False) reraise(t, v, tb) finally: del t, v, tb else: self._free() self._synchronizers.map(lambda s: s.afterCompletion(self)) await self._acallAfterCommitHooks(status=True) self.log.debug("commit")
def commit(self): """See `~transaction.interfaces.ITransaction`.""" if self.status is Status.DOOMED: raise interfaces.DoomedTransaction( 'transaction doomed, cannot commit') if self._savepoint2index: self._invalidate_all_savepoints() if self.status is Status.COMMITFAILED: self._prior_operation_failed() # doesn't return self._callBeforeCommitHooks() self._synchronizers.map(lambda s: s.beforeCompletion(self)) self.status = Status.COMMITTING try: self._commitResources() self.status = Status.COMMITTED except: # noqa: E722 do not use bare 'except' t = None v = None tb = None try: t, v, tb = self._saveAndGetCommitishError() self._callAfterCommitHooks(status=False) reraise(t, v, tb) finally: del t, v, tb else: self._synchronizers.map(lambda s: s.afterCompletion(self)) self._callAfterCommitHooks(status=True) self._free() self.log.debug("commit")
def _saveAndRaiseCommitishError(self): t = None v = None tb = None try: t, v, tb = self._saveAndGetCommitishError() reraise(t, v, tb) finally: del t, v, tb
def abort(self): """ See `~transaction.interfaces.ITransaction`. """ try: t = None v = None tb = None self._callBeforeAbortHooks() if self._savepoint2index: self._invalidate_all_savepoints() try: self._synchronizers.map(lambda s: s.beforeCompletion(self)) except: t, v, tb = sys.exc_info() self.log.error("Failed to call synchronizers", exc_info=sys.exc_info()) for rm in self._resources: try: rm.abort(self) except: if tb is None: t, v, tb = sys.exc_info() self.log.error("Failed to abort resource manager: %s", rm, exc_info=sys.exc_info()) self._callAfterAbortHooks() # Unlike in commit(), we are no longer the current transaction # when we call afterCompletion(). But we can't be completely _free(): # the synchronizer might want to access some data it set before. self._free_manager() self._synchronizers.map(lambda s: s.afterCompletion(self)) self.log.debug("abort") if tb is not None: reraise(t, v, tb) finally: self._free() del t, v, tb
def abort(self, txn): t = None v = None tb = None try: for o in self.objects: try: self.manager.abort(o, txn) except: # Capture the first exception and re-raise it after # aborting all the other objects. if tb is None: t, v, tb = sys.exc_info() txn.log.error("Failed to abort object: %s", object_hint(o), exc_info=sys.exc_info()) if tb is not None: reraise(t, v, tb) finally: del t, v, tb
def _commitResources(self): # Execute the two-phase commit protocol. L = list(self._resources) L.sort(key=rm_key) try: for rm in L: rm.tpc_begin(self) for rm in L: rm.commit(self) self.log.debug("commit %r", rm) for rm in L: rm.tpc_vote(self) self._voted[id(rm)] = True try: for rm in L: rm.tpc_finish(self) except: # TODO: do we need to make this warning stronger? # TODO: It would be nice if the system could be configured # to stop committing transactions at this point. self.log.critical("A storage error occurred during the second " "phase of the two-phase commit. Resources " "may be in an inconsistent state.") raise except: # If an error occurs committing a transaction, we try # to revert the changes in each of the resource managers. t, v, tb = sys.exc_info() try: try: self._cleanup(L) finally: self._synchronizers.map(lambda s: s.afterCompletion(self)) reraise(t, v, tb) finally: del t, v, tb
def _retry_or_raise(self, t, v, tb): retry = self.manager._retryable(t, v) self.manager.abort() if retry: return retry # suppress the exception if necessary reraise(t, v, tb) # otherwise reraise the exception