dovecot-2.1: unlink_old_files(): Update atime before scan, not a...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Mar 23 13:35:10 EET 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/091b9f49f24f
changeset: 14342: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