changeset 22178:e97e52bd980f

quota-clone: Don't clone quota resources that aren't enabled. They would always just be zeros anyway, so this makes the update slightly more efficient. Although practically this only matters with dirsize and fs quotas, which people generally don't use with quota_clone.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 08 Jun 2017 20:29:05 +0300
parents 3001873cd962
children 549b74a60b5c
files src/plugins/quota-clone/quota-clone-plugin.c
diffstat 1 files changed, 24 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/quota-clone/quota-clone-plugin.c	Thu Jun 08 20:39:47 2017 +0300
+++ b/src/plugins/quota-clone/quota-clone-plugin.c	Thu Jun 08 20:29:05 2017 +0300
@@ -47,6 +47,8 @@
 	struct quota_root_iter *iter;
 	struct quota_root *root;
 	uint64_t bytes_value, count_value, limit;
+	const char *error;
+	int ret_bytes, ret_count;
 
 	/* we'll clone the first quota root */
 	iter = quota_root_iter_init(box);
@@ -59,23 +61,36 @@
 	}
 
 	/* get new values first */
-	if (quota_get_resource(root, "", QUOTA_NAME_STORAGE_BYTES,
-			       &bytes_value, &limit) < 0) {
+	ret_bytes = quota_get_resource(root, "", QUOTA_NAME_STORAGE_BYTES,
+				       &bytes_value, &limit);
+	if (ret_bytes < 0) {
 		i_error("quota_clone_plugin: Failed to lookup current quota bytes");
 		return;
 	}
-	if (quota_get_resource(root, "", QUOTA_NAME_MESSAGES,
-			       &count_value, &limit) < 0) {
+	ret_count = quota_get_resource(root, "", QUOTA_NAME_MESSAGES,
+				       &count_value, &limit);
+	if (ret_count < 0) {
 		i_error("quota_clone_plugin: Failed to lookup current quota count");
 		return;
 	}
+	if (ret_bytes == 0 && ret_count == 0) {
+		/* quota isn't enabled - no point in updating it */
+		return;
+	}
 
-	/* then update them */
+	/* Then update the resources that exist. The resources can't really
+	   change unless the quota backend is changed, so we don't worry about
+	   the special case of ret_count changing between 1 and 0. Note that
+	   ret_count==1 also when quota is unlimited. */
 	trans = dict_transaction_begin(quser->dict);
-	dict_set(trans, DICT_QUOTA_CLONE_BYTES_PATH,
-		 t_strdup_printf("%llu", (unsigned long long)bytes_value));
-	dict_set(trans, DICT_QUOTA_CLONE_COUNT_PATH,
-		 t_strdup_printf("%llu", (unsigned long long)count_value));
+	if (ret_bytes > 0) {
+		dict_set(trans, DICT_QUOTA_CLONE_BYTES_PATH,
+			 t_strdup_printf("%llu", (unsigned long long)bytes_value));
+	}
+	if (ret_count > 0) {
+		dict_set(trans, DICT_QUOTA_CLONE_COUNT_PATH,
+			 t_strdup_printf("%llu", (unsigned long long)count_value));
+	}
 	if (dict_transaction_commit(&trans) < 0)
 		i_error("quota_clone_plugin: Failed to commit dict update");
 	else