import os import logging import transaction from ZODB import FileStorage, DB from BTrees.OOBTree import OOBTree NAME = "chow.fs" logging.basicConfig() def open(): global fstorage, db, conn, root fstorage = FileStorage.FileStorage(NAME) db = DB(fstorage) conn = db.open() root = conn.root() def close(): conn.close() db.close() open() sv = transaction.savepoint() root['files'] = OOBTree() sv.rollback() if 0: # if 1, no mysterious errors later transaction.abort() # Something related to savepoints is surviving across the # close, which causes later problems. close() os.unlink(NAME) open() root['files'] = OOBTree() transaction.commit() # dies here """ First an error is logged: ERROR:txn.1024:Error in tpc_abort() on manager Traceback (most recent call last): File "C:\code\zodb3.5\src\transaction\_transaction.py", line 474, in _cleanup rm.tpc_abort(self) File "C:\code\zodb3.5\src\ZODB\Connection.py", line 620, in tpc_abort self._storage.tpc_abort(transaction) File "C:\code\zodb3.5\src\ZODB\BaseStorage.py", line 193, in tpc_abort self._abort() File "C:\code\zodb3.5\src\ZODB\FileStorage\FileStorage.py", line 939, in _abort if self._nextpos: AttributeError: 'FileStorage' object has no attribute '_nextpos' Then a code-visible exception occurs; Traceback (most recent call last): File "what.py", line 38, in ? transaction.commit() File "C:\code\zodb3.5\src\transaction\_manager.py", line 96, in commit return self.get().commit(sub, deprecation_wng=False) File "C:\code\zodb3.5\src\transaction\_transaction.py", line 393, in commit self._saveCommitishError() # This raises! File "C:\code\zodb3.5\src\transaction\_transaction.py", line 391, in commit self._commitResources() File "C:\code\zodb3.5\src\transaction\_transaction.py", line 434, in _commitResources rm.tpc_begin(self) File "C:\code\zodb3.5\src\ZODB\Connection.py", line 468, in tpc_begin self._normal_storage.tpc_begin(transaction) File "C:\code\zodb3.5\src\ZODB\BaseStorage.py", line 216, in tpc_begin self._clear_temp() File "C:\code\zodb3.5\src\ZODB\FileStorage\FileStorage.py", line 851, in _clear_temp self._tfile.seek(0) ValueError: I/O operation on closed file """ close()