Mercurial > dovecot > core-2.2
changeset 9297:3d20388cee21 HEAD
doveadm: Memory usage improvements.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 15 May 2009 16:12:49 -0400 |
parents | 0fb684847ae1 |
children | 468273e27777 |
files | src/util/doveadm.c |
diffstat | 1 files changed, 36 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/src/util/doveadm.c Fri May 15 16:12:43 2009 -0400 +++ b/src/util/doveadm.c Fri May 15 16:12:49 2009 -0400 @@ -115,14 +115,44 @@ mail_storage_service_deinit_user(); } +static int +handle_next_user(struct mail_storage_service_multi_ctx *multi, + const struct mail_storage_service_input *input, + pool_t pool, char *argv[]) +{ + struct mail_storage_service_multi_user *multi_user; + const char *error; + int ret; + + i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username)); + ret = mail_storage_service_multi_lookup(multi, input, pool, + &multi_user, &error); + if (ret <= 0) { + if (ret == 0) { + i_info("User no longer exists, skipping"); + return 0; + } else { + i_error("User lookup failed: %s", error); + return -1; + } + } + if (mail_storage_service_multi_next(multi, multi_user, + &mail_user, &error) < 0) { + i_error("User init failed: %s", error); + return -1; + } + handle_command(mail_user, argv[0], argv+1); + mail_user_unref(&mail_user); + return 0; +} + static void handle_all_users(struct master_service *service, enum mail_storage_service_flags service_flags, char *argv[]) { struct mail_storage_service_input input; struct mail_storage_service_multi_ctx *multi; - struct mail_storage_service_multi_user *multi_user; - const char *error, *user; + const char *user; pool_t pool; int ret; @@ -131,7 +161,7 @@ memset(&input, 0, sizeof(input)); multi = mail_storage_service_multi_init(service, NULL, service_flags); - pool = pool_alloconly_create("multi user", 1024); + pool = pool_alloconly_create("multi user", 8192); lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL); lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL); @@ -145,28 +175,11 @@ } p_clear(pool); input.username = user; - i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", - input.username)); - ret = mail_storage_service_multi_lookup(multi, &input, pool, - &multi_user, &error); - if (ret <= 0) { - if (ret == 0) { - i_info("User no longer exists, skipping"); - continue; - } else { - i_error("User lookup failed: %s", error); - break; - } - } - if (mail_storage_service_multi_next(multi, multi_user, - &mail_user, &error) < 0) { - i_error("User init failed: %s", error); - continue; - } T_BEGIN { - handle_command(mail_user, argv[0], argv+1); + ret = handle_next_user(multi, &input, pool, argv); } T_END; - mail_user_unref(&mail_user); + if (ret < 0) + break; } i_set_failure_prefix("doveadm: "); if (ret < 0)