Commit 84aa0c13 authored by Jason Madden's avatar Jason Madden

Correct potential deadlock in ClientStorage:tpc_begin by being sure to release...

Correct potential deadlock in ClientStorage:tpc_begin by being sure to release locks in a finally block.
parent 09db1b2e
...@@ -1111,18 +1111,19 @@ class ClientStorage(object): ...@@ -1111,18 +1111,19 @@ class ClientStorage(object):
if self._is_read_only: if self._is_read_only:
raise POSException.ReadOnlyError() raise POSException.ReadOnlyError()
self._tpc_cond.acquire() self._tpc_cond.acquire()
try:
self._midtxn_disconnect = 0 self._midtxn_disconnect = 0
while self._transaction is not None: while self._transaction is not None:
# It is allowable for a client to call two tpc_begins in a # It is allowable for a client to call two tpc_begins in a
# row with the same transaction, and the second of these # row with the same transaction, and the second of these
# must be ignored. # must be ignored.
if self._transaction == txn: if self._transaction == txn:
self._tpc_cond.release()
raise POSException.StorageTransactionError( raise POSException.StorageTransactionError(
"Duplicate tpc_begin calls for same transaction") "Duplicate tpc_begin calls for same transaction")
self._tpc_cond.wait(30) self._tpc_cond.wait(30)
self._transaction = txn self._transaction = txn
finally:
self._tpc_cond.release() self._tpc_cond.release()
try: try:
...@@ -1143,8 +1144,10 @@ class ClientStorage(object): ...@@ -1143,8 +1144,10 @@ class ClientStorage(object):
# the right way to set self._transaction to None # the right way to set self._transaction to None
# calls notify() on _tpc_cond in case there are waiting threads # calls notify() on _tpc_cond in case there are waiting threads
self._tpc_cond.acquire() self._tpc_cond.acquire()
try:
self._transaction = None self._transaction = None
self._tpc_cond.notify() self._tpc_cond.notify()
finally:
self._tpc_cond.release() self._tpc_cond.release()
def lastTransaction(self): def lastTransaction(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment