Commit 04ba442d authored by Michael Howitz's avatar Michael Howitz Committed by GitHub

Merge pull request #226 from zopefoundation/sunew-failing-test-for-208

Fix KeyError on releasing resources of a Connection when closing the DB.
parents dd92b75c bf344679
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
5.5.1 (unreleased) 5.5.1 (unreleased)
================== ==================
- TBD - Fix KeyError on releasing resources of a Connection when closing the DB.
This requires at least version 2.4 of the `transaction` package.
See `issue 208 <https://github.com/zopefoundation/ZODB/issues/208>`.
5.5.0 (2018-10-13) 5.5.0 (2018-10-13)
================== ==================
......
...@@ -72,7 +72,7 @@ setup( ...@@ -72,7 +72,7 @@ setup(
'persistent >= 4.4.0', 'persistent >= 4.4.0',
'BTrees >= 4.2.0', 'BTrees >= 4.2.0',
'ZConfig', 'ZConfig',
'transaction >= 2.0.3', 'transaction >= 2.4',
'six', 'six',
'zc.lockfile', 'zc.lockfile',
'zope.interface', 'zope.interface',
......
...@@ -884,7 +884,10 @@ class Connection(ExportImport, object): ...@@ -884,7 +884,10 @@ class Connection(ExportImport, object):
""" """
if transaction_manager is None: if transaction_manager is None:
transaction_manager = transaction.manager # The .manager bit below unwraps the threaded
# manager so we can call unregisterSynch in close
# when close is called from another thread.
transaction_manager = transaction.manager.manager
self.transaction_manager = transaction_manager self.transaction_manager = transaction_manager
......
import threading
import time
import unittest
import ZODB
class ZODBClientThread(threading.Thread):
def __init__(self, db, test):
threading.Thread.__init__(self)
self._exc_info = None
self.setDaemon(True)
self.db = db
self.test = test
self.event = threading.Event()
def run(self):
conn = self.db.open()
conn.sync()
self.event.set()
time.sleep(15)
# conn.close calls self.transaction_manager.unregisterSynch(self)
# and this succeeds.
conn.close()
class ShutdownTest(ZODB.tests.util.TestCase):
def setUp(self):
# Our default transaction manager is
# transaction._manager.ThreadTransactionManager
# so no need to set it.
ZODB.tests.util.TestCase.setUp(self)
self._storage = ZODB.FileStorage.FileStorage(
'ZODBTests.fs', create=1)
self._db = ZODB.DB(self._storage)
def check_shutdown(self):
client_thread = ZODBClientThread(self._db, self)
client_thread.start()
client_thread.event.wait()
# calls conn._release_resources, that calls conn.close(),
# that calls conn.transaction_manager.unregisterSynch(self),
# but from a different thread, so transaction_manager._synchs
# have different contents.
self._db.close()
def tearDown(self):
ZODB.tests.util.TestCase.tearDown(self)
def test_suite():
return unittest.makeSuite(ShutdownTest, "check")
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