Skip to content

Commit

Permalink
quota-clone: Don't clone quota resources that aren't enabled.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
sirainen authored and GitLab committed Jun 12, 2017
1 parent eec34b3 commit a022e47
Showing 1 changed file with 23 additions and 9 deletions.
32 changes: 23 additions & 9 deletions src/plugins/quota-clone/quota-clone-plugin.c
Expand Up @@ -48,6 +48,7 @@ static void quota_clone_flush_real(struct mailbox *box)
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);
Expand All @@ -60,23 +61,36 @@ static void quota_clone_flush_real(struct mailbox *box)
}

/* 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, &error) < 0)
i_error("quota_clone_plugin: Failed to commit dict update: %s", error);
else
Expand Down

0 comments on commit a022e47

Please sign in to comment.