mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-22 09:24:54 +01:00
new: Improved workaround for mistaken new directories
Currently, notmuch new assumes any directory with a database mtime of 0 is new, but we don't set the mtime until after processing messages and subdirectories in that directory. Hence, anything that prevents the mtime update (such as an interruption or the wall-clock logic introduced in8c39e8d6
) will cause the next notmuch new to think the directory is still new. We work around this by setting the new directory's database mtime to -1 before scanning anything in the new directory. This also obviates the need for the workaround used in8c39e8d6
.
This commit is contained in:
parent
a31ad0bd01
commit
bb2b33fbb8
1 changed files with 20 additions and 11 deletions
|
@ -256,6 +256,25 @@ add_files_recursive (notmuch_database_t *notmuch,
|
|||
|
||||
new_directory = db_mtime ? FALSE : TRUE;
|
||||
|
||||
/* XXX This is a temporary workaround. If we don't update the
|
||||
* database mtime until after processing messages in this
|
||||
* directory, then a 0 mtime is *not* sufficient to indicate that
|
||||
* this directory has no messages or subdirs in the database (for
|
||||
* example, if an earlier run skipped the mtime update because
|
||||
* fs_mtime == stat_time, or was interrupted before updating the
|
||||
* mtime at the end). To address this, we record a (bogus)
|
||||
* non-zero value before processing any child messages so that a
|
||||
* later run won't mistake this for a new directory (and, for
|
||||
* example, fail to detect removed files and subdirs).
|
||||
*
|
||||
* A better solution would be for notmuch_database_get_directory
|
||||
* to indicate if it really created a new directory or not, either
|
||||
* by a new out-argument, or by recording this information and
|
||||
* providing an accessor.
|
||||
*/
|
||||
if (new_directory)
|
||||
notmuch_directory_set_mtime (directory, -1);
|
||||
|
||||
/* If the database knows about this directory, then we sort based
|
||||
* on strcmp to match the database sorting. Otherwise, we can do
|
||||
* inode-based sorting for faster filesystem operation. */
|
||||
|
@ -516,17 +535,7 @@ add_files_recursive (notmuch_database_t *notmuch,
|
|||
* when we stat'ed the directory, we skip updating the mtime in
|
||||
* the database because a message could be delivered later in this
|
||||
* same second. This may lead to unnecessary re-scans, but it
|
||||
* avoids overlooking messages.
|
||||
*
|
||||
* XXX Bug workaround: If this is a new directory, we *must*
|
||||
* update the mtime; otherwise the next run will see the 0 mtime
|
||||
* and think this is still a new directory containing no files or
|
||||
* subdirs (which is unsound in general). If fs_mtime ==
|
||||
* stat_time, we set the database mtime to a bogus (but non-zero!)
|
||||
* value to force a rescan.
|
||||
*/
|
||||
if (new_directory && fs_mtime == stat_time)
|
||||
fs_mtime = 1;
|
||||
* avoids overlooking messages. */
|
||||
if (! interrupted && fs_mtime != stat_time) {
|
||||
status = notmuch_directory_set_mtime (directory, fs_mtime);
|
||||
if (status && ret == NOTMUCH_STATUS_SUCCESS)
|
||||
|
|
Loading…
Reference in a new issue