[Zope-Checkins] CVS: ZODB/src/ZODB/FileStorage - fspack.py:1.13

Tim Peters tim.one at comcast.net
Tue Mar 30 16:53:43 EST 2004

Update of /cvs-repository/ZODB/src/ZODB/FileStorage
In directory cvs.zope.org:/tmp/cvs-serv8862/src/ZODB/FileStorage

Modified Files:
Log Message:
FileStoragePacker:  the change yesterday to speed packing by doing most
of pack in buffered mode, then switching to unbuffered mode to copy the
tail, actually broke pack completely on Windows:  we didn't close the
buffered file handle before opening the unbuffered one, and self.gc held
on to the still-open former handle.  This prevented the caller from
renaming Data.fs to Data.fs.old (a handle on Data.fs was still open).
The cure is simply to close a handle when we stop using it.

=== ZODB/src/ZODB/FileStorage/fspack.py 1.12 => 1.13 ===
--- ZODB/src/ZODB/FileStorage/fspack.py:1.12	Mon Mar 29 21:43:25 2004
+++ ZODB/src/ZODB/FileStorage/fspack.py	Tue Mar 30 16:53:40 2004
@@ -416,6 +416,10 @@
     # progress after it).
     def __init__(self, path, stop, la, lr, cla, clr, current_size):
         self._name = path
+        # We open our own handle on the storage so that much of pack can
+        # proceed in parallel.  It's important to close this file at every
+        # return point, else on Windows the caller won't be able to rename
+        # or remove the storage file.
         self._file = open(path, "rb")
         self._path = path
         self._stop = stop
@@ -481,6 +485,7 @@
         if ipos == opos:
             # pack didn't free any data.  there's no point in continuing.
+            self._file.close()
             os.remove(self._name + ".pack")
             return None
@@ -499,6 +504,7 @@
             # trailing 0 argument, and then on every platform except
             # native Windows it was observed that we could read stale
             # data from the tail end of the file.
+            self._file.close()  # else self.gc keeps the original alive & open
             self._file = open(self._path, "rb", 0)
             self._file.seek(0, 2)
             self.file_end = self._file.tell()

More information about the Zope-Checkins mailing list