changeset 13250:b7a6573dacca

lib-storage: Moved stats_* from mail to transaction. With the API changes to search, having them in mail doesn't make sense anymore, since mailbox_search_next() can return multiple different mails with different stats.
author Timo Sirainen <tss@iki.fi>
date Tue, 16 Aug 2011 17:02:08 +0300
parents 3936152ecc03
children 390f69281fb8
files src/lib-storage/index/cydir/cydir-mail.c src/lib-storage/index/dbox-common/dbox-mail.c src/lib-storage/index/dbox-multi/mdbox-mail.c src/lib-storage/index/dbox-single/sdbox-mail.c src/lib-storage/index/index-mail-headers.c src/lib-storage/index/index-mail.c src/lib-storage/index/index-search.c src/lib-storage/index/istream-mail-stats.c src/lib-storage/index/istream-mail-stats.h src/lib-storage/index/maildir/maildir-mail.c src/lib-storage/index/raw/raw-mail.c src/lib-storage/mail-storage-private.h
diffstat 12 files changed, 54 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/cydir/cydir-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/cydir/cydir-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -20,13 +20,12 @@
 
 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)
@@ -100,7 +99,7 @@
 	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) {
--- a/src/lib-storage/index/dbox-common/dbox-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/dbox-common/dbox-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -145,7 +145,7 @@
 	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);
--- a/src/lib-storage/index/dbox-multi/mdbox-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -126,7 +126,7 @@
 		}
 
 		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) {
--- a/src/lib-storage/index/dbox-single/sdbox-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/dbox-single/sdbox-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -68,7 +68,7 @@
 
 	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) {
--- a/src/lib-storage/index/index-mail-headers.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/index-mail-headers.c	Tue Aug 16 17:02:08 2011 +0300
@@ -625,7 +625,7 @@
 		*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) {
@@ -807,7 +807,7 @@
 	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 =
--- a/src/lib-storage/index/index-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/index-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -50,7 +50,7 @@
 	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;
 }
 
@@ -830,12 +830,14 @@
 			   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;
--- a/src/lib-storage/index/index-search.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/index-search.c	Tue Aug 16 17:02:08 2011 +0300
@@ -1184,41 +1184,36 @@
 	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;
 }
@@ -1471,7 +1466,7 @@
 			  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;
--- a/src/lib-storage/index/istream-mail-stats.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/istream-mail-stats.c	Tue Aug 16 17:02:08 2011 +0300
@@ -8,7 +8,7 @@
 struct mail_stats_istream {
 	struct istream_private istream;
 
-	struct mail_private *mail;
+	struct mailbox_transaction_context *trans;
 	unsigned int files_read_increased:1;
 };
 
@@ -24,10 +24,10 @@
 
 	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;
@@ -47,13 +47,14 @@
 	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;
--- a/src/lib-storage/index/istream-mail-stats.h	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/istream-mail-stats.h	Tue Aug 16 17:02:08 2011 +0300
@@ -1,7 +1,8 @@
 #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
--- a/src/lib-storage/index/maildir/maildir-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/maildir/maildir-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -62,7 +62,6 @@
 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;
@@ -72,7 +71,7 @@
 	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;
@@ -121,13 +120,13 @@
 	}
 
 	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)
@@ -135,7 +134,7 @@
 			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,
--- a/src/lib-storage/index/raw/raw-mail.c	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/index/raw/raw-mail.c	Tue Aug 16 17:02:08 2011 +0300
@@ -12,13 +12,12 @@
 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,
--- a/src/lib-storage/mail-storage-private.h	Tue Aug 16 16:59:40 2011 +0300
+++ b/src/lib-storage/mail-storage-private.h	Tue Aug 16 17:02:08 2011 +0300
@@ -333,21 +333,6 @@
 
 	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 {
@@ -380,6 +365,21 @@
 		     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 {