[Dovecot] Filesystem Quota Enhancement Patch
Scott Alter
scott at symphonyhosting.com
Tue Aug 22 08:15:23 EEST 2006
> I guess for v1.0 that's fine, but do you think for CVS HEAD this could
> be done using two quotaroots? Do clients even understand more than one
> quota root?
>
There are a few considerations that need to be made regarding support
for multiple quotaroots. I believe that this will require the
modification of the imap_quota plugin first in order to accommodate a
mapping between namespaces and quotaroots (more below). I've been
reading over RFC 2087 (IMAP4 QUOTA extension), and have a few
considerations and possibilities. I do not know if there are any
clients that support multiple quotaroots, but that doesn't mean Dovecot
shouldn't be standards compliant. If I have time, I will attempt to
hack Dovecot to return multiple quotaroots and see how Thunderbird responds.
I first want to call to your attention the presence of a draft of a new
RFC which has long expired -
http://www.melnikov.ca/mel/Drafts/draft-cridland-imap-quota-00.txt. It
would have addressed all of these issues, but I guess it never caught
on. Since we're stuck with RFC 2087, here are my thoughts.
The first possibility is to have only one quotaroot for each namespace
and return multiple of the same resources for the quota. Since both the
user and group quotas apply to the same quotaroot, they theoretically
could both be returned. From the RFC (5.1 QUOTA Response):
> The [quota root] is followed by a S-expression format list of the
> resource usage and limits of the quota root. The list contains zero or
> more triplets. Each triplet conatins a resource name, the current
> usage of the resource, and the resource limit.
If I interpreted this RFC correctly, there could theoretically be
multiple storage and message resource limits for each quotaroot. So,
there could be a response like: "* QUOTA "" (STORAGE 10 512 STORAGE 123
6000 STORAGE 45 50 MESSAGE 5 20)". This could be used to show both user
and group quotas in 1 quotaroot, plus additional quota information
coming from different sources (fs, dict, maildir, dirsize) all in one
quotaroot. The downside is that there is no differentiation between
which quota comes from where (user vs. group & fs vs dict vs maildir vs
dirsize). Also, this might not be what the author of the RFC had in
mind, and it may never be supported by any clients.
Assuming that we cannot proceed with multiple of the same resources, we
need to define what exactly a quotaroot is. The RFC (3 Introduction and
Overview) says:
> Each mailbox has zero or more implementation-defined named "quota
> roots". Each quota root has zero or more resource limits. All
> mailboxes that share the same named quota root share the resource
> limits of the quota root.
This is pretty ambiguous. A problem with the current specifications is
that there is no mapping between mailboxes and quotaroots. I assume
that currently, it works by equating one quotaroot to each namespace
with the quotaroot named for the namespace. I know that Dovecot does
not yet fully support this even, but if this is the case, to support
multiple quotaroots in a namespace, we would need to define the
quotaroots for each namespace in the Dovecot config file. Otherwise,
there is no way to support multiple quotaroots for any namespace.
Once quotaroots are named, it is then necessary to define the limits of
the quotaroot and where to get the quota from (fs, maildir, dict,
dirsize). This could be done also in each namespace section, or it
could be kept in the plugin section. This can get complicated because
ideally, you would be able to specify the name of the quotaroot, the
backend, and which resource to use. This is also true of filesystem
quotas, since we want the user and group quotas to be in different
quotaroots. Also, some quotaroots may be used in multiple namespaces
(such as multiple namespaces on a single filesystem). For example:
namespace private {
prefix =
location = maildir:~/Maildir
quotaroots = userroot grouproot
}
namespace private {
prefix = "#moremail/"
location = maildir:~/mail
quotaroot = moremailroot userroot grouproot
}
plugin {
quota = userroot:fs:storage=user:messages=user
grouproot:fs:storage=group:messages=group moremailroot:maildir:storage=10240
}
I do not think it would be possible to have a maildir or dirsize
backends span multiple namespaces. For filesystem-based quotas,
assuming that a namespace is only on one filesystem (does not span
across multiple partitions), it could span partitions.
To begin to tackle this big change, I would recommend first adding a
quotaroots variable to the config file. Then, use this quotaroot to
look up where to get the quota from rather than just taking it blindly
from the plugins section regardless of the namespace. After this, the
dirsize, dict, and maildir quota plugins should with with little
modification. The fs quota plugin will require a little modification,
as the resources are not currently passed from the conf file to the plugin.
On the other hand for the filesystem quotas, you could make the
configuration like "quota = quotaroot:fs:source=user" or "quota =
quotaroot:fs:source=group", and just pass the source to the plugin. The
storage and messages would both always be returned, because if they are
present on the filesystem, they exist and do not need to be hidden.
Another (possibly more difficult) option for filesystem-based quotas is
to leave the config file like "quota = quotaroot:fs" and have the
quota-fs backend return 2 quotaroots automatically if there are both
user and group quotas (and rename the quotaroot to quotaroot-user and
quotaroot-group).
These are my suggestions. I'm not sure what the major changes are to
the CVS HEAD branch, but I think there needs to be a way to map
quotaroots to namespaces. To answer your question, the filesystem quota
backend probably could return 2 quotaroots without too much
modification, but it would be a hack...and I wouldn't want the next
version of Dovecot to start off with some hacks to get the job done!
-Scott
More information about the dovecot
mailing list