Commit 8f32f81f authored by Christian Theune's avatar Christian Theune

Backported fix for bug #126007.

parent a3d73055
...@@ -79,6 +79,9 @@ Transactions ...@@ -79,6 +79,9 @@ Transactions
Blobs Blobs
----- -----
- (3.8b3) Fixed bug #126007: tpc_abort had untested code path that was
broken.
- (3.8b1) Updated the Blob implementation in a number of ways. Some - (3.8b1) Updated the Blob implementation in a number of ways. Some
of these are backward incompatible with 3.8a1: of these are backward incompatible with 3.8a1:
......
...@@ -447,7 +447,7 @@ class BlobStorage(SpecificationDecoratorBase): ...@@ -447,7 +447,7 @@ class BlobStorage(SpecificationDecoratorBase):
while self.dirty_oids: while self.dirty_oids:
oid, serial = self.dirty_oids.pop() oid, serial = self.dirty_oids.pop()
clean = self.fshelper.getBlobFilename(oid, serial) clean = self.fshelper.getBlobFilename(oid, serial)
if os.exists(clean): if os.path.exists(clean):
remove_committed(clean) remove_committed(clean)
@non_overridable @non_overridable
......
...@@ -37,7 +37,7 @@ Putting a Blob into a Connection works like any other Persistent object:: ...@@ -37,7 +37,7 @@ Putting a Blob into a Connection works like any other Persistent object::
>>> root1['blob1'] = blob1 >>> root1['blob1'] = blob1
>>> 'blob1' in root1 >>> 'blob1' in root1
True True
Aborting a blob add leaves the blob unchanged: Aborting a blob add leaves the blob unchanged:
>>> transaction.abort() >>> transaction.abort()
...@@ -310,6 +310,36 @@ You can't open a committed blob file for writing: ...@@ -310,6 +310,36 @@ You can't open a committed blob file for writing:
... ...
IOError: ... IOError: ...
tpc_abort with dirty data
-------------------------
When `tpc_abort` is called during the first commit phase we need to be able to
clean up dirty files:
>>> class DummyBaseStorage(object):
... def tpc_abort(self):
... pass
>>> base_storage = DummyBaseStorage()
>>> blob_dir2 = mkdtemp()
>>> blob_storage = BlobStorage(blob_dir2, base_storage)
>>> committed_blob_dir = os.path.join(blob_dir2, '0')
>>> committed_blob_file = os.path.join(committed_blob_dir, '0.blob')
>>> os.mkdir(committed_blob_dir)
>>> open(os.path.join(committed_blob_file), 'w').write('foo')
>>> os.path.exists(committed_blob_file)
True
Now, telling the storage that Blob 0 and Blob 1 (both with serial 0) are dirty
will: remove the committed file for Blob 0 and ignore the fact that Blob 1 is
set to dirty but doesn't actually have an existing file:
>>> blob_storage.dirty_oids = [(0, 0), (1, 0)]
>>> blob_storage.tpc_abort()
>>> os.path.exists(committed_blob_file)
False
Note: This is a counter measure against regression of bug #126007.
Teardown Teardown
-------- --------
...@@ -319,3 +349,6 @@ We don't need the storage directory and databases anymore:: ...@@ -319,3 +349,6 @@ We don't need the storage directory and databases anymore::
>>> tm1.abort() >>> tm1.abort()
>>> tm2.abort() >>> tm2.abort()
>>> database.close() >>> database.close()
>>> import shutil
>>> shutil.rmtree(blob_dir)
>>> shutil.rmtree(blob_dir2)
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