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 in 8c39e8d6) 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 in 8c39e8d6.
This commit is contained in:
Austin Clements 2011-06-29 19:00:01 -04:00 committed by Carl Worth
parent a31ad0bd01
commit bb2b33fbb8

View file

@ -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)