Ensure idl.run() called on TRY_AGAIN
If the DB connection drops after Connection.run() calls idl.run() but before Transaction.do_commit(), then it is possible for idl.commit() to return TRY_AGAIN due to the failure of session.send(). This prevents commit_block() from running idl.run() which would actually trigger the DB reconnect, causing each successive call to commit_block() to fail in the same way until we stop trying again due to timeout and Connection.run() calls idl.run() again. For now, we can just ensure that idl.run() is called when we get a TRY_AGAIN. It might be worth it to refactor this a bit to not even use commit_block(). Change-Id: I77402bde3fc4d45c770b9f48882870cfc91d719d Closes-Bug: #1741889
This commit is contained in:
parent
f674dfd254
commit
1810faecc9
@ -91,6 +91,13 @@ class Transaction(api.Transaction):
|
|||||||
status = txn.commit_block()
|
status = txn.commit_block()
|
||||||
if status == txn.TRY_AGAIN:
|
if status == txn.TRY_AGAIN:
|
||||||
LOG.debug("OVSDB transaction returned TRY_AGAIN, retrying")
|
LOG.debug("OVSDB transaction returned TRY_AGAIN, retrying")
|
||||||
|
# In the case that there is a reconnection after
|
||||||
|
# Connection.run() calls self.idl.run() but before do_commit()
|
||||||
|
# is called, commit_block() can loop w/o calling idl.run()
|
||||||
|
# which does the reconnect logic. It will then always return
|
||||||
|
# TRY_AGAIN until we time out and Connection.run() calls
|
||||||
|
# idl.run() again. So, call idl.run() here just in case.
|
||||||
|
self.api.idl.run()
|
||||||
continue
|
continue
|
||||||
elif status == txn.ERROR:
|
elif status == txn.ERROR:
|
||||||
msg = "OVSDB Error: %s" % txn.get_error()
|
msg = "OVSDB Error: %s" % txn.get_error()
|
||||||
|
Loading…
Reference in New Issue
Block a user