From 1004f3a441f624db083990c9a882f760e5016e3c Mon Sep 17 00:00:00 2001 From: Bron Gondwana Date: Wed, 17 Jun 2009 22:08:58 +1000 Subject: [PATCH] Add "-x" option to cyr_expire to disable expunge Delayed expunge is great and all, but it causes a LOT of IO because you need to stat every mailbox's meta files, and you need to read all of every cyrus.expunge file. That's not something you might want to do every time you want to clean out the duplicate delivery database. Change cyr_expire to add a "-x" option. Ideally I'd like to just have not specifying a "-X" mean don't do it, but I think it might be too late for that. It would make disks fill up with junk at too many sites. --- imap/cyr_expire.c | 79 +++++++++++++++++++++++++++++----------------------- 1 files changed, 44 insertions(+), 35 deletions(-) diff --git a/imap/cyr_expire.c b/imap/cyr_expire.c index fcdc47c..70ed275 100644 --- a/imap/cyr_expire.c +++ b/imap/cyr_expire.c @@ -361,7 +361,7 @@ static void sighandler (int sig) int main(int argc, char *argv[]) { extern char *optarg; - int opt, r = 0, expire_days = 0, expunge_days = -1, delete_days = -1; + int opt, r = 0, expire_days = 0, expunge_days = -1, delete_days = -1, do_expunge = 1; char *alt_config = NULL; char *find_prefix = NULL; char buf[100]; @@ -379,7 +379,7 @@ int main(int argc, char *argv[]) memset(&erock, 0, sizeof(erock)); memset(&drock, 0, sizeof(drock)); - while ((opt = getopt(argc, argv, "C:D:E:X:p:va")) != EOF) { + while ((opt = getopt(argc, argv, "C:D:E:X:p:vax")) != EOF) { switch (opt) { case 'C': /* alt config file */ alt_config = optarg; @@ -400,6 +400,11 @@ int main(int argc, char *argv[]) expunge_days = atoi(optarg); break; + case 'x': + if (!do_expunge) usage(); + do_expunge = 0; + break; + case 'p': find_prefix = optarg; break; @@ -447,48 +452,51 @@ int main(int argc, char *argv[]) exit(1); } - /* xxx better way to determine a size for this table? */ - construct_hash_table(&expire_table, 10000, 1); - - /* expire messages from mailboxes, - * build a hash table of mailboxes in which we expired messages, - * and perform a cleanup of expunged messages - */ - erock.table = &expire_table; - erock.expunge_mode = config_getenum(IMAPOPT_EXPUNGE_MODE); - if (expunge_days == -1) { - erock.expunge_mark = 0; - } else { - erock.expunge_mark = time(0) - (expunge_days * 60 * 60 * 24); - - if (erock.verbose && - erock.expunge_mode != IMAP_ENUM_EXPUNGE_MODE_IMMEDIATE) { - fprintf(stderr, - "Expunging deleted messages in mailboxes older than %d days\n", - expunge_days); + if (do_expunge) { + /* xxx better way to determine a size for this table? */ + construct_hash_table(&expire_table, 10000, 1); + + /* expire messages from mailboxes, + * build a hash table of mailboxes in which we expired messages, + * and perform a cleanup of expunged messages + */ + erock.table = &expire_table; + erock.expunge_mode = config_getenum(IMAPOPT_EXPUNGE_MODE); + if (expunge_days == -1) { + erock.expunge_mark = 0; + } else { + erock.expunge_mark = time(0) - (expunge_days * 60 * 60 * 24); + + if (erock.verbose && + erock.expunge_mode != IMAP_ENUM_EXPUNGE_MODE_IMMEDIATE) { + fprintf(stderr, + "Expunging deleted messages in mailboxes older than %d days\n", + expunge_days); + } } - } - if (find_prefix) { - strlcpy(buf, find_prefix, sizeof(buf)); - } else { - strlcpy(buf, "*", sizeof(buf)); - } + if (find_prefix) { + strlcpy(buf, find_prefix, sizeof(buf)); + } else { + strlcpy(buf, "*", sizeof(buf)); + } - mboxlist_findall(NULL, buf, 1, 0, 0, &expire, &erock); + mboxlist_findall(NULL, buf, 1, 0, 0, &expire, &erock); - syslog(LOG_NOTICE, "Expunged %lu out of %lu messages from %lu mailboxes", - erock.deleted, erock.messages, erock.mailboxes); - if (erock.verbose) { - fprintf(stderr, "\nExpunged %lu out of %lu messages from %lu mailboxes\n", - erock.deleted, erock.messages, erock.mailboxes); + syslog(LOG_NOTICE, "Expunged %lu out of %lu messages from %lu mailboxes", + erock.deleted, erock.messages, erock.mailboxes); + if (erock.verbose) { + fprintf(stderr, "\nExpunged %lu out of %lu messages from %lu mailboxes\n", + erock.deleted, erock.messages, erock.mailboxes); + } } + if (sigquit) { - goto finish; + goto finish; } if ((delete_days != -1) && mboxlist_delayed_delete_isenabled() && - (deletedprefix = config_getstring(IMAPOPT_DELETEDPREFIX))) { + (deletedprefix = config_getstring(IMAPOPT_DELETEDPREFIX))) { struct delete_node *node; int count = 0; @@ -527,6 +535,7 @@ int main(int argc, char *argv[]) } syslog(LOG_NOTICE, "Removed %d deleted mailboxes", count); } + if (sigquit) { goto finish; } -- 1.5.6.5