dovecot-2.2: unlink_old_files(): Update atime before scan, not a...

dovecot at dovecot.org dovecot at dovecot.org
Sun May 20 03:26:30 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/091b9f49f24f
changeset: 14378:091b9f49f24f
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Mar 23 13:35:05 2012 +0200
description:
unlink_old_files(): Update atime before scan, not after.
If Maildir/dbox scanning takes long this makes sure that a lot of processes
won't be scanning it in parallel.

diffstat:

 src/lib/unlink-old-files.c |  18 +++++-------------
 src/lib/unlink-old-files.h |   3 ++-
 2 files changed, 7 insertions(+), 14 deletions(-)

diffs (48 lines):

diff -r 98fd46f8d1ab -r 091b9f49f24f src/lib/unlink-old-files.c
--- a/src/lib/unlink-old-files.c	Fri Mar 23 13:24:34 2012 +0200
+++ b/src/lib/unlink-old-files.c	Fri Mar 23 13:35:05 2012 +0200
@@ -28,6 +28,11 @@
 		return -1;
 	}
 
+	/* update atime immediately, so if this scanning is done based on
+	   atime it won't be done by multiple processes if the scan is slow */
+	if (utime(dir, NULL) < 0 && errno != ENOENT)
+		i_error("utime(%s) failed: %m", dir);
+
 	path = t_str_new(256);
 	str_printfa(path, "%s/", dir);
 	dir_len = str_len(path);
@@ -54,19 +59,6 @@
 		}
 	}
 
-#ifdef HAVE_DIRFD
-	if (fstat(dirfd(dirp), &st) < 0)
-		i_error("fstat(%s) failed: %m", dir);
-#else
-	if (stat(dir, &st) < 0)
-		i_error("stat(%s) failed: %m", dir);
-#endif
-	else if (st.st_atime < ioloop_time) {
-		/* mounted with noatime. update it ourself. */
-		if (utime(dir, NULL) < 0 && errno != ENOENT)
-			i_error("utime(%s) failed: %m", dir);
-	}
-
 	if (closedir(dirp) < 0)
 		i_error("closedir(%s) failed: %m", dir);
 	return 0;
diff -r 98fd46f8d1ab -r 091b9f49f24f src/lib/unlink-old-files.h
--- a/src/lib/unlink-old-files.h	Fri Mar 23 13:24:34 2012 +0200
+++ b/src/lib/unlink-old-files.h	Fri Mar 23 13:35:05 2012 +0200
@@ -2,7 +2,8 @@
 #define UNLINK_OLD_FILES_H
 
 /* Unlink all files from directory beginning with given prefix and having
-   ctime older than min_time. Returns -1 if there were some errors. */
+   ctime older than min_time. Makes sure that the directory's atime is updated.
+   Returns -1 if there were some errors. */
 int unlink_old_files(const char *dir, const char *prefix, time_t min_time);
 
 #endif


More information about the dovecot-cvs mailing list