static int cydir_mail_stat(struct mail *mail, struct stat *st_r)
{
- struct mail_private *p = (struct mail_private *)mail;
const char *path;
if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE)
return mail_set_aborted(mail);
- p->stats_stat_lookup_count++;
+ mail->transaction->stats_stat_lookup_count++;
path = cydir_mail_get_path(mail);
if (stat(path, st_r) < 0) {
if (errno == ENOENT)
int fd;
if (mail->data.stream == NULL) {
- mail->mail.stats_open_lookup_count++;
+ _mail->transaction->stats_open_lookup_count++;
path = cydir_mail_get_path(_mail);
fd = open(path, O_RDONLY);
if (fd == -1) {
if (storage->v.mail_open(mail, &offset, &file) < 0)
return -1;
- mail->imail.mail.stats_fstat_lookup_count++;
+ _mail->transaction->stats_fstat_lookup_count++;
if (dbox_file_stat(file, &st) < 0) {
if (errno == ENOENT)
mail_set_expunged(_mail);
}
if (!dbox_file_is_open(mail->open_file))
- mail->imail.mail.stats_open_lookup_count++;
+ _mail->transaction->stats_open_lookup_count++;
if (dbox_file_open(mail->open_file, &deleted) <= 0)
return -1;
if (deleted) {
if (!sdbox_mail_file_set(mail)) {
if (!dbox_file_is_open(mail->open_file))
- mail->imail.mail.stats_open_lookup_count++;
+ _mail->transaction->stats_open_lookup_count++;
if (dbox_file_open(mail->open_file, &deleted) <= 0)
return -1;
if (deleted) {
*value_r = index_mail_get_parsed_header(mail, field_idx);
return 0;
}
- mail->mail.stats_cache_hit_count++;
+ _mail->transaction->stats_cache_hit_count++;
data = buffer_get_modifiable_data(dest, &len);
if (len == 0) {
if (mail_cache_lookup_headers(_mail->transaction->cache_view, dest,
_mail->seq, headers->idx,
headers->count) > 0) {
- mail->mail.stats_cache_hit_count++;
+ _mail->transaction->stats_cache_hit_count++;
if (mail->data.filter_stream != NULL)
i_stream_destroy(&mail->data.filter_stream);
mail->data.filter_stream =
ret = mail_cache_lookup_field(mail->mail.mail.transaction->cache_view,
buf, mail->data.seq, field_idx);
if (ret > 0)
- mail->mail.stats_cache_hit_count++;
+ mail->mail.mail.transaction->stats_cache_hit_count++;
return ret;
}
struct message_size *body_size,
struct istream **stream_r)
{
+ struct mail *_mail = &mail->mail.mail;
struct index_mail_data *data = &mail->data;
struct istream *input;
int ret;
- if (!data->initialized_wrapper_stream && mail->mail.stats_track) {
- input = i_stream_create_mail_stats_counter(&mail->mail,
+ if (!data->initialized_wrapper_stream &&
+ _mail->transaction->stats_track) {
+ input = i_stream_create_mail_stats_counter(_mail->transaction,
data->stream);
i_stream_unref(&data->stream);
data->stream = input;
array_free(&ctx->mail_ctx.results);
array_free(&ctx->mail_ctx.module_contexts);
- array_foreach_modifiable(&ctx->mails, mailp) {
- struct index_mail *imail = (struct index_mail *)*mailp;
-
- imail->search_mail = FALSE;
+ array_foreach_modifiable(&ctx->mails, mailp)
mail_free(mailp);
- }
array_free(&ctx->mails);
i_free(ctx);
return ret;
}
-static unsigned long long search_mail_get_cost(struct mail_private *mail)
+static unsigned long long
+search_get_cost(struct mailbox_transaction_context *trans)
{
- return mail->stats_open_lookup_count * SEARCH_COST_DENTRY +
- mail->stats_stat_lookup_count * SEARCH_COST_DENTRY +
- mail->stats_fstat_lookup_count * SEARCH_COST_ATTR +
- mail->stats_cache_hit_count * SEARCH_COST_CACHE +
- mail->stats_files_read_count * SEARCH_COST_FILES_READ +
- (mail->stats_files_read_bytes/1024) * SEARCH_COST_KBYTE;
+ return trans->stats_open_lookup_count * SEARCH_COST_DENTRY +
+ trans->stats_stat_lookup_count * SEARCH_COST_DENTRY +
+ trans->stats_fstat_lookup_count * SEARCH_COST_ATTR +
+ trans->stats_cache_hit_count * SEARCH_COST_CACHE +
+ trans->stats_files_read_count * SEARCH_COST_FILES_READ +
+ (trans->stats_files_read_bytes/1024) * SEARCH_COST_KBYTE;
}
static int search_match_once(struct index_search_context *ctx)
{
- struct mail_private *mail_private =
- (struct mail_private *)ctx->cur_mail;
unsigned long long cost1, cost2;
int ret;
- cost1 = search_mail_get_cost(mail_private);
+ cost1 = search_get_cost(ctx->cur_mail->transaction);
ret = mail_search_args_foreach(ctx->mail_ctx.args->args,
search_cached_arg, ctx);
if (ret < 0)
ret = search_arg_match_text(ctx->mail_ctx.args->args, ctx);
- cost2 = search_mail_get_cost(mail_private);
+ cost2 = search_get_cost(ctx->cur_mail->transaction);
ctx->cost += cost2 - cost1;
return ret;
}
ctx->mail_ctx.wanted_headers);
imail = (struct index_mail *)mail;
imail->search_mail = TRUE;
- imail->mail.stats_track = TRUE;
+ ctx->mail_ctx.transaction->stats_track = TRUE;
array_append(&ctx->mails, &mail, 1);
return mail;
struct mail_stats_istream {
struct istream_private istream;
- struct mail_private *mail;
+ struct mailbox_transaction_context *trans;
unsigned int files_read_increased:1;
};
ret = i_stream_read_copy_from_parent(&stream->istream);
if (ret > 0) {
- mstream->mail->stats_files_read_bytes += ret;
+ mstream->trans->stats_files_read_bytes += ret;
if (!mstream->files_read_increased) {
mstream->files_read_increased = TRUE;
- mstream->mail->stats_files_read_count++;
+ mstream->trans->stats_files_read_count++;
}
}
return ret;
return i_stream_stat(stream->parent, exact);
}
-struct istream *i_stream_create_mail_stats_counter(struct mail_private *mail,
- struct istream *input)
+struct istream *
+i_stream_create_mail_stats_counter(struct mailbox_transaction_context *trans,
+ struct istream *input)
{
struct mail_stats_istream *mstream;
mstream = i_new(struct mail_stats_istream, 1);
- mstream->mail = mail;
+ mstream->trans = trans;
mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
mstream->istream.parent = input;
#ifndef ISTREAM_MAIL_STATS_H
#define ISTREAM_MAIL_STATS_H
-struct istream *i_stream_create_mail_stats_counter(struct mail_private *mail,
- struct istream *input);
+struct istream *
+i_stream_create_mail_stats_counter(struct mailbox_transaction_context *trans,
+ struct istream *input);
#endif
maildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail,
bool *deleted_r)
{
- struct mail_private *p = (struct mail_private *)mail;
struct istream *input;
const char *path;
struct maildir_open_context ctx;
ctx.fd = -1;
ctx.path = NULL;
- p->stats_open_lookup_count++;
+ mail->transaction->stats_open_lookup_count++;
if (!mail->saving) {
if (maildir_file_do(mbox, mail->uid, do_open, &ctx) < 0)
return NULL;
}
if (imail->data.stream != NULL) {
- imail->mail.stats_fstat_lookup_count++;
+ mail->transaction->stats_fstat_lookup_count++;
stp = i_stream_stat(imail->data.stream, FALSE);
if (stp == NULL)
return -1;
*st = *stp;
} else if (!mail->saving) {
- imail->mail.stats_stat_lookup_count++;
+ mail->transaction->stats_stat_lookup_count++;
ret = maildir_file_do(mbox, mail->uid, do_stat, st);
if (ret <= 0) {
if (ret == 0)
return -1;
}
} else {
- imail->mail.stats_stat_lookup_count++;
+ mail->transaction->stats_stat_lookup_count++;
path = maildir_save_file_get_path(mail->transaction, mail->seq);
if (stat(path, st) < 0) {
mail_storage_set_critical(mail->box->storage,
static int raw_mail_stat(struct mail *mail)
{
struct raw_mailbox *mbox = (struct raw_mailbox *)mail->box;
- struct mail_private *p = (struct mail_private *)mail;
const struct stat *st;
if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE)
return mail_set_aborted(mail);
- p->stats_fstat_lookup_count++;
+ mail->transaction->stats_fstat_lookup_count++;
st = i_stream_stat(mail->box->input, TRUE);
if (st == NULL) {
mail_storage_set_critical(mail->box->storage,
pool_t pool;
ARRAY_DEFINE(module_contexts, union mail_module_context *);
-
- /* these statistics are never reset by mail-storage API: */
-
- unsigned long stats_open_lookup_count;
- unsigned long stats_stat_lookup_count;
- unsigned long stats_fstat_lookup_count;
- /* number of files we've opened and read */
- unsigned long stats_files_read_count;
- /* number of bytes we've had to read from files */
- unsigned long long stats_files_read_bytes;
- /* number of cache lookup hits */
- unsigned long stats_cache_hit_count;
-
- /* Set to TRUE to update stats_* fields */
- unsigned int stats_track:1;
};
struct mailbox_list_context {
union mailbox_transaction_module_context *);
struct mail_save_context *save_ctx;
+
+ /* these statistics are never reset by mail-storage API: */
+
+ unsigned long stats_open_lookup_count;
+ unsigned long stats_stat_lookup_count;
+ unsigned long stats_fstat_lookup_count;
+ /* number of files we've opened and read */
+ unsigned long stats_files_read_count;
+ /* number of bytes we've had to read from files */
+ unsigned long long stats_files_read_bytes;
+ /* number of cache lookup hits */
+ unsigned long stats_cache_hit_count;
+
+ /* Set to TRUE to update stats_* fields */
+ unsigned int stats_track:1;
};
union mail_search_module_context {