コード例 #1
0
    def commit(self):
        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:
            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:
            if self._manager:
                self._manager.free(self)
            self._synchronizers.map(lambda s: s.afterCompletion(self))
            self._callAfterCommitHooks(status=True)
        self.log.debug("commit")
コード例 #2
0
    def abort(self):
        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
コード例 #3
0
ファイル: _transaction.py プロジェクト: c0ns0le/zenoss-4
    def abort(self):
        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
コード例 #4
0
ファイル: _transaction.py プロジェクト: c0ns0le/zenoss-4
    def commit(self):
        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:
            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:
            if self._manager:
                self._manager.free(self)
            self._synchronizers.map(lambda s: s.afterCompletion(self))
            self._callAfterCommitHooks(status=True)
        self.log.debug("commit")
コード例 #5
0
 def _saveAndRaiseCommitishError(self):
     t = None
     v = None
     tb = None
     try:
         t, v, tb = self._saveAndGetCommitishError()
         reraise(t, v, tb)
     finally:
         del t, v, tb
コード例 #6
0
ファイル: _transaction.py プロジェクト: c0ns0le/zenoss-4
 def _saveAndRaiseCommitishError(self):
     t = None
     v = None
     tb = None
     try:
         t, v, tb = self._saveAndGetCommitishError()
         reraise(t, v, tb)
     finally:
         del t, v, tb
コード例 #7
0
ファイル: _transaction.py プロジェクト: c0ns0le/zenoss-4
    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
コード例 #8
0
    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
コード例 #9
0
    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
コード例 #10
0
ファイル: _transaction.py プロジェクト: c0ns0le/zenoss-4
    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