New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mailbox.mbox fails to pop two items in a row, flushing in between #59241
Comments
test_mbox is an mbox mailbox with a few messages in it. >>> import mailbox
>>> inbox = mailbox.mbox('test_mbox')
>>> inbox.lock()
>>> inbox.popitem()
(0, <mailbox.mboxMessage instance at 0x7f78016bc680>)
>>> inbox.flush()
>>> inbox.unlock()
>>> inbox.lock()
>>> inbox.popitem()
(1, <mailbox.mboxMessage instance at 0x7f7801653320>)
>>> inbox.flush()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/mailbox.py", line 633, in flush
(self._file_length, cur_len))
mailbox.ExternalClashError: Size of mailbox file changed (expected 141289, found 141147) |
Actually, you don't even need to unlock() and lock() the mailbox before the second popitem() and flush(). |
The fix seems to be very simple: diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index a677729..2be4c83 100644
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -675,6 +675,7 @@ class _singlefileMailbox(Mailbox):
new_file.write(buffer)
new_toc[key] = (new_start, new_file.tell())
self._post_message_hook(new_file)
+ self._file_length = new_file.tell()
except:
new_file.close()
os.remove(new_file.name) I guess all single-file mailboxes have this issue, not only mbox. I'll still need to add tests when I have time. |
As I suspected, all single-file mailboxes(mbox, MMDF, Babyl) have this issue. Attached a patch with tests. |
New changeset 0add70dd3c43 by Petri Lehtinen in branch '2.7': New changeset 714b8f91f3d4 by Petri Lehtinen in branch '3.2': New changeset 87d119117560 by Petri Lehtinen in branch 'default': |
The news item isn't completely clear. It sounds like the mailbox is now automatically being flushed between pops, but what you really fixed is popping if the *application* does a flush between them, right? |
Yes, this is what I tried to say. It's hard for me to find a good I also noticed now that there's a typo in the commit messages. But |
"Mailbox no longer throws an error if a flush is done between operations when removing or changing multiple items in mbox, MMDF, or Babyl mailboxes." |
New changeset 8b38a81ba3bf by Petri Lehtinen in branch '2.7': New changeset 38e2a87c9051 by Petri Lehtinen in branch '3.2': New changeset 072b08989731 by Petri Lehtinen in branch 'default': |
Perfect, fixed. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: