dovecot-2.2: quota: Added "count" backend, which simply sums up ...

dovecot at dovecot.org dovecot at dovecot.org
Mon Sep 21 13:37:34 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/f205f3d56093
changeset: 19169:f205f3d56093
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Sep 21 16:36:05 2015 +0300
description:
quota: Added "count" backend, which simply sums up mailboxes' vsizes.
In a way this is similar to the simple "dirsize" backend, but much more
efficient. As long as mailbox_list_index=yes, the quota can typically be
looked up only by reading the dovecot.list.index* files.

This backend enforces using quota_vsizes=yes setting to keep the performance
good, because physical sizes don't have a similar optimized vsize header.
There's also no especially good reason why this backend should support
physical sizes - they were originally mainly used to allow quickly stat()ing
Maildir files.

diffstat:

 src/plugins/quota/quota-count.c |  75 +++++++++++++++++++++++++++++++++++++++++
 src/plugins/quota/quota.c       |   2 +
 2 files changed, 77 insertions(+), 0 deletions(-)

diffs (101 lines):

diff -r e29d2f7fe53f -r f205f3d56093 src/plugins/quota/quota-count.c
--- a/src/plugins/quota/quota-count.c	Mon Sep 21 16:32:27 2015 +0300
+++ b/src/plugins/quota/quota-count.c	Mon Sep 21 16:36:05 2015 +0300
@@ -107,3 +107,78 @@
 	root->recounting = FALSE;
 	return ret;
 }
+
+static struct quota_root *count_quota_alloc(void)
+{
+	return i_new(struct quota_root, 1);
+}
+
+static int count_quota_init(struct quota_root *root, const char *args,
+			    const char **error_r)
+{
+	if (!root->quota->set->vsizes) {
+		*error_r = "quota count backend requires quota_vsizes=yes";
+		return -1;
+	}
+	return quota_root_default_init(root, args, error_r);
+}
+
+static void count_quota_deinit(struct quota_root *_root)
+{
+	i_free(_root);
+}
+
+static const char *const *
+count_quota_root_get_resources(struct quota_root *root ATTR_UNUSED)
+{
+	static const char *resources[] = {
+		QUOTA_NAME_STORAGE_KILOBYTES, QUOTA_NAME_MESSAGES, NULL
+	};
+	return resources;
+}
+
+static int
+count_quota_get_resource(struct quota_root *root,
+			 const char *name, uint64_t *value_r)
+{
+	uint64_t bytes, count;
+
+	if (quota_count(root, &bytes, &count) < 0)
+		return -1;
+
+	if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0)
+		*value_r = bytes;
+	else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0)
+		*value_r = count;
+	else
+		return 0;
+	return 1;
+}
+
+static int
+count_quota_update(struct quota_root *root ATTR_UNUSED,
+		   struct quota_transaction_context *ctx ATTR_UNUSED)
+{
+	if (ctx->recalculate) {
+		//FIXME: remove cached values from index
+	}
+	return 0;
+}
+
+struct quota_backend quota_backend_count = {
+	"count",
+
+	{
+		count_quota_alloc,
+		count_quota_init,
+		count_quota_deinit,
+		NULL,
+		NULL,
+		NULL,
+		count_quota_root_get_resources,
+		count_quota_get_resource,
+		count_quota_update,
+		NULL,
+		NULL
+	}
+};
diff -r e29d2f7fe53f -r f205f3d56093 src/plugins/quota/quota.c
--- a/src/plugins/quota/quota.c	Mon Sep 21 16:32:27 2015 +0300
+++ b/src/plugins/quota/quota.c	Mon Sep 21 16:36:05 2015 +0300
@@ -29,6 +29,7 @@
 
 unsigned int quota_module_id = 0;
 
+extern struct quota_backend quota_backend_count;
 extern struct quota_backend quota_backend_dict;
 extern struct quota_backend quota_backend_dirsize;
 extern struct quota_backend quota_backend_fs;
@@ -38,6 +39,7 @@
 #ifdef HAVE_FS_QUOTA
 	&quota_backend_fs,
 #endif
+	&quota_backend_count,
 	&quota_backend_dict,
 	&quota_backend_dirsize,
 	&quota_backend_maildir


More information about the dovecot-cvs mailing list