X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=python%2Fovs%2Fdb%2Fidl.py;h=6150a02e10419ce417c6aaa64dc298e1c9c574a3;hb=c4f2731da69eaba5f4bb95583225a5399875f6fc;hp=cd72fe4dec8bacbd2674b7323f25373be888f3c6;hpb=3a656eafb96ab8a474e943baabdb2679d0a6b0ef;p=openvswitch diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py index cd72fe4d..6150a02e 100644 --- a/python/ovs/db/idl.py +++ b/python/ovs/db/idl.py @@ -441,7 +441,7 @@ class Idl: def __txn_abort_all(self): while self._outstanding_txns: txn = self._outstanding_txns.popitem()[1] - txn._status = Transaction.TRY_AGAIN + txn._status = Transaction.AGAIN_WAIT def __txn_process_reply(self, msg): txn = self._outstanding_txns.pop(msg.id, None) @@ -561,7 +561,9 @@ class Row(object): if 'column_name' changed in this row (or if this row was deleted) between the time that the IDL originally read its contents and the time that the transaction commits, then the transaction aborts and - Transaction.commit() returns Transaction.TRY_AGAIN. + Transaction.commit() returns Transaction.AGAIN_WAIT or + Transaction.AGAIN_NOW (depending on whether the database change has + already been received). The intention is that, to ensure that no transaction commits based on dirty reads, an application should call Row.verify() on each data item @@ -620,9 +622,12 @@ class Transaction(object): INCOMPLETE = "incomplete" # Commit in progress, please wait. ABORTED = "aborted" # ovsdb_idl_txn_abort() called. SUCCESS = "success" # Commit successful. - TRY_AGAIN = "try again" # Commit failed because a "verify" operation + AGAIN_WAIT = "wait then try again" + # Commit failed because a "verify" operation # reported an inconsistency, due to a network - # problem, or other transient failure. + # problem, or other transient failure. Wait + # for a change, then try again. + AGAIN_NOW = "try again now" # Same as AGAIN_WAIT but try again right away. NOT_LOCKED = "not locked" # Server hasn't given us the lock yet. ERROR = "error" # Commit failed due to a hard error. @@ -657,6 +662,7 @@ class Transaction(object): self._status = Transaction.UNCOMMITTED self._error = None self._comments = [] + self._commit_seqno = self.idl.change_seqno self._inc_table = None self._inc_column = None @@ -827,7 +833,7 @@ class Transaction(object): self.idl._outstanding_txns[self._request_id] = self self._status = Transaction.INCOMPLETE else: - self._status = Transaction.TRY_AGAIN + self._status = Transaction.AGAIN_WAIT self.__disassemble() return self._status @@ -982,7 +988,10 @@ class Transaction(object): elif lock_errors: self._status = Transaction.NOT_LOCKED elif soft_errors: - self._status = Transaction.TRY_AGAIN + if self._commit_seqno == self.idl.change_seqno: + self._status = Transaction.AGAIN_WAIT + else: + self._status = Transaction.AGAIN_NOW else: self._status = Transaction.SUCCESS