Maildir: avoid race conditions when email are deleted while reading#6
Open
klaernie wants to merge 1 commit intoPerl-Email-Project:masterfrom
Open
Maildir: avoid race conditions when email are deleted while reading#6klaernie wants to merge 1 commit intoPerl-Email-Project:masterfrom
klaernie wants to merge 1 commit intoPerl-Email-Project:masterfrom
Conversation
As the list of email is generated before all emails can be iterated, there is always a chance that another program accesses the Maildir and decides to delete a file. In my use case we iterate over a directory scanning for the most recently received mail, and have a daily cleanup job remove older mails. Expectedly whenever the cleanup job runs our script fails to complete, since the script needs to scan and parse 30k mails, and the cleanup job only needs to delete files (so it always overtakes the scanning script). The solution is to ignore only "No such file or directory" errors when opening a mail, and if this error occurs directly go to the next message. All other errors are reported back to the user as before. I've considered the following alternatives: - read all emails into memory directly, before even parsing them => possibly too much mail to sensibly keep in memory - only one call of readdir() per next_message() call => already POSIX.1-2024 suggests in the description of readdir and opendir that there are no guarantees if files created since the opendir or last rewinddir are returned at all, or files skipped that have been deleted. Conversely they make the remark, that applications conventionally have requested buffers with more than one directory entry, so no matter what we do in perl code, the libraries will already have a cache filled with possibly outdated files. Hence I deemed both alternatives non-feasible.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
As the list of email is generated before all emails can be iterated, there is always a chance that another program accesses the Maildir and decides to delete a file.
In my use case we iterate over a directory scanning for the most recently received mail, and have a daily cleanup job remove older mails. Expectedly whenever the cleanup job runs our script fails to complete, since the script needs to scan and parse 30k mails, and the cleanup job only needs to delete files (so it always overtakes the scanning script).
The solution is to ignore only "No such file or directory" errors when opening a mail, and if this error occurs directly go to the next message. All other errors are reported back to the user as before.
I've considered the following alternatives:
Hence I deemed both alternatives non-feasible.