mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +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;
|
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
|
/* If the database knows about this directory, then we sort based
|
||||||
* on strcmp to match the database sorting. Otherwise, we can do
|
* on strcmp to match the database sorting. Otherwise, we can do
|
||||||
* inode-based sorting for faster filesystem operation. */
|
* 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
|
* when we stat'ed the directory, we skip updating the mtime in
|
||||||
* the database because a message could be delivered later in this
|
* the database because a message could be delivered later in this
|
||||||
* same second. This may lead to unnecessary re-scans, but it
|
* same second. This may lead to unnecessary re-scans, but it
|
||||||
* avoids overlooking messages.
|
* 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;
|
|
||||||
if (! interrupted && fs_mtime != stat_time) {
|
if (! interrupted && fs_mtime != stat_time) {
|
||||||
status = notmuch_directory_set_mtime (directory, fs_mtime);
|
status = notmuch_directory_set_mtime (directory, fs_mtime);
|
||||||
if (status && ret == NOTMUCH_STATUS_SUCCESS)
|
if (status && ret == NOTMUCH_STATUS_SUCCESS)
|
||||||
|
|
Loading…
Reference in a new issue