Mark Moseley
2019-Apr-10  02:00 UTC
[BUG?] Double quota calulation when special folder is present
On Wed, Apr 3, 2019 at 9:37 PM Mark Moseley <moseleymark at gmail.com> wrote:> > On Wed, Mar 20, 2019 at 2:13 PM Mark Moseley <moseleymark at gmail.com> > wrote: > >> Just hoping to get some dev eyes on this. I'm incredibly reluctant to >> throw the word 'bug' around >> (since 99 times out of 100, it's not -- it's almost always the config), >> but I can't think of any way >> that this could be a config issue, esp when the pre-2.2.34 version works >> as expected. >> >> I noticed during troubleshooting that dovecot errors out if I try to >> create a subfolder called >> 'INBOX' but it'll happily create a subfolder called INBOX.SomethingElse >> (i.e. a folder called >> INBOX.INBOX.SomethingElse - resulting in a directory called >> .INBOX.SomethingElse on the >> filesystem, and leading to the problem described below). Is that >> sub-subfolder creation (where >> the top level subfolder matches the namespace name) supposed to be >> allowed? It seems >> odd that 'INBOX' (as a subfolder of INBOX) would be blocked but >> INBOX.SomethingElse (as >> a subfolder of INBOX) would be allowed. I'd expect INBOX.SomethingElse >> (i.e. >> INBOX.INBOX.SomethingElse) would be blocked as well. >> >> >> On Wed, Mar 13, 2019 at 4:46 AM Bernd Wurst via dovecot < >> dovecot at dovecot.org> wrote: >> >>> Hello, >>> >>> we're operating dovecot on a small server. Some years ago, we migrated >>> from courier IMAP to dovecot. Therefore, we defined our default >>> Namespace "inbox" with prefix "INBOX." to have this compatible. I found >>> this in some migration docs those days. Generally, everything worked as >>> expected. >>> >>> Our only namespace is configured like this: >>> >>> namespace inbox { >>> separator = . >>> prefix = INBOX. >>> inbox = yes >>> } >>> >>> Regularly, there is no folder named INBOX or .INBOX in the file system, >>> I suppose this is correct. But I found a special corner case today when >>> it comes to quota calculation. >>> >>> When - for whatever reason - a folder .INBOX.foo (for arbitrary values >>> of foo) exists, the whole mailbox is counted twice in quota >>> recalculation. Just creating .INBOX does nothing but a subfolder >>> triggers the problem. >>> >>> This is my shell view (replaced username and file path and deleted >>> unnecessary debug output) >>> >>> $ cat maildirsize >>> 268435456S >>> 14697 17 >>> $ maildirmake .INBOX.foo >>> $ sudo doveadm -D quota recalc -u <user> >>> [...] >>> doveadm(<user>): Debug: Namespace inbox: type=private, prefix=INBOX., >>> sep=., inbox=yes, hidden=no, list=yes, subscriptions=yes >>> location=maildir:/home/.../test >>> doveadm(<user>): Debug: maildir++: root=/home/.../test, index=, >>> indexpvt=, control=, inbox=/home/.../test, alt>>> doveadm(<user>): Debug: Namespace : type=private, prefix=, sep=, >>> inbox=no, hidden=yes, list=no, subscriptions=no >>> location=fail::LAYOUT=none >>> doveadm(<user>): Debug: none: root=, index=, indexpvt=, control=, >>> inbox=, alt>>> doveadm(<user>): Debug: quota: quota_over_flag check: quota_over_script >>> unset - skipping >>> doveadm(<user>): Debug: Quota root User quota: Recalculated relative >>> rules with bytes=268435456 count=0. Now grace=26843545 >>> doveadm(<user>): Debug: Namespace INBOX.: Using permissions from >>> /home/.../test: mode=0700 gid=default >>> >>> $ cat maildirsize >>> 268435456S >>> 29394 34 >>> >>> >>> So the used quota has exactly been doubled by just creating an empty >>> subfolder. >>> >>> Do you have any pointers for fixing my configuration or is this a bug in >>> dovecot? >>> >>> >> I coincidentally resurrected a months-old thread with this same issue a >> few days ago. I'm seeing the exact same after upgrading from 2.2.32 to >> 2.2.36. >> >> The original poster (who also narrowed it down to something in 2.2.34) >> mentioned a workaround that does indeed work, namely setting >> mailbox_list_index=no: >> >> > doveadm -o 'mailbox_list_index=no' quota recalc -u myuser >> >> I've been staring at diffs of 2.2.33 and 2.2.34 without anything jumping >> out at me (not a C guy, sadly). Maybe src/lib-storage/index/index-storage.c >> or src/lib-storage/list/mailbox-list-fs-iter.c or >> src/lib-storage/list/mailbox-list-index-iter.c >> or src/lib-storage/list/mailbox-list-index.c? >> >> The latter few have some added strcmp's against "INBOX". Then again, >> there's a lot of new code in the diffs under src/lib-storage that >> references INBOX specifically. >> > > Can the Dovecot team confirm whether this is indeed a bug or not? I've > not yet been able to test 2.3.x to see if the problem exists there as well. >I've bisected this down to this commit: git diff 7620195ceeea805137cbd1bae104e385eee474a9..97473a513feb2bbd763051869c8b7b83e24b37fa diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index c9afc7a..49cd941 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -90,13 +90,18 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx) if (strcmp(ctx->info.vname, "INBOX") != 0) { /* non-INBOX */ ctx->info.vname = p_strdup(ctx->info_pool, ctx->info.vname); - } else { + } else if (!ctx->prefix_inbox_list) { /* listing INBOX itself */ ctx->info.vname = "INBOX"; if (mail_namespace_is_inbox_noinferiors(ctx->info.ns)) { ctx->info.flags &~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN); ctx->info.flags |= MAILBOX_NOINFERIORS; } + } else { + /* listing INBOX/INBOX */ + ctx->info.vname = p_strconcat(ctx->info_pool, + ctx->ctx.list->ns->prefix, "INBOX", NULL); + ctx->info.flags |= MAILBOX_NONEXISTENT; } if ((node->flags & MAILBOX_LIST_INDEX_FLAG_NONEXISTENT) != 0) ctx->info.flags |= MAILBOX_NONEXISTENT; @@ -126,6 +131,14 @@ mailbox_list_index_update_next(struct mailbox_list_index_iterate_context *ctx, { struct mailbox_list_index_node *node = ctx->next_node; + if (!ctx->prefix_inbox_list && ctx->ctx.list->ns->prefix_len > 0 && + strcmp(node->name, "INBOX") == 0 && node->parent == NULL && + node->children != NULL) { + /* prefix/INBOX has children */ + ctx->prefix_inbox_list = TRUE; + return; + } + if (node->children != NULL && follow_children) { ctx->parent_len = str_len(ctx->path); ctx->next_node = node->children; diff --git a/src/lib-storage/list/mailbox-list-index.h b/src/lib-storage/list/mailbox-list-index.h index 9dc1c48..e4b042a 100644 --- a/src/lib-storage/list/mailbox-list-index.h +++ b/src/lib-storage/list/mailbox-list-index.h @@ -138,6 +138,7 @@ struct mailbox_list_index_iterate_context { struct mailbox_list_index_node *next_node; unsigned int failed:1; + unsigned int prefix_inbox_list:1; }; extern MODULE_CONTEXT_DEFINE(mailbox_list_index_module, Prior to this commit, anything updating the quota would do the right thing for any .INBOX.<something> folders (i.e. not double count the contents of "INBOX" against the quota). After this commit, anything updating quota (new mail, quota recalc, etc) does the double counting of INBOX. -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://dovecot.org/pipermail/dovecot/attachments/20190409/65a7cc6c/attachment-0001.html>
Aki Tuomi
2019-Apr-10  04:52 UTC
[BUG?] Double quota calulation when special folder is present
<!doctype html>
<html>
 <head> 
  <meta charset="UTF-8"> 
 </head>
 <body>
  <div>
   <br>
  </div>
  <blockquote type="cite">
   <div>
    On 10 April 2019 05:00 Mark Moseley via dovecot <dovecot@dovecot.org>
wrote:
   </div>
   <div>
    <br>
   </div>
   <div>
    <br>
   </div>
   <div dir="ltr">
    <div dir="ltr">
     <div dir="ltr">
      <div dir="ltr">
       On Wed, Apr 3, 2019 at 9:37 PM Mark Moseley <
       <a
href="mailto:moseleymark@gmail.com">moseleymark@gmail.com</a>>
wrote:
       <br>
      </div>
      <div class="gmail_quote">
       <blockquote>
        <div dir="ltr">
         <div dir="ltr">
          <br>
         </div>
         <div class="gmail_quote">
          <div class="gmail_attr" dir="ltr">
           On Wed, Mar 20, 2019 at 2:13 PM Mark Moseley <
           <a target="_blank"
href="mailto:moseleymark@gmail.com"
rel="noopener">moseleymark@gmail.com</a>> wrote:
           <br>
          </div>
          <blockquote>
           <div dir="ltr">
            <div dir="ltr">
             <div style="margin: 0px; padding: 0px 0px 20px; width:
1270px; font-family: Roboto,RobotoDraft,Helvetica,Arial,sans-serif;"
class="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-gs">
              <div
class="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-">
               <div style="font-size: 12.800000190734863px; margin: 8px
0px 0px; padding: 0px;"
class="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-ii
gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-gt"
id="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-:gj1">
                <div
class="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-a3s
gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-aXjCH"
id="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-:gi4">
                 <div dir="ltr">
                  <div dir="ltr">
                   <div dir="ltr">
                    <div dir="ltr">
                     <div dir="ltr">
                      <div dir="ltr">
                       <div dir="ltr">
                        <div dir="ltr">
                         <div class="gmail_quote">
                          <div
class="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-adM">
                           <div
class="gmail-m_4417296991923282657gmail-m_5214552142079555927gmail-im">
                            <div class="gmail_attr">
                             Just hoping to get some dev eyes on this. I'm
incredibly reluctant to throw the word 'bug' around
                            </div>
                            <div class="gmail_attr">
                             (since 99 times out of 100, it's not --
it's almost always the config), but I can't think of any way
                            </div>
                            <div class="gmail_attr">
                             that this could be a config issue, esp when the
pre-2.2.34 version works as expected.
                            </div>
                            <div class="gmail_attr">
                             <br>
                            </div>
                            <div class="gmail_attr">
                             I noticed during troubleshooting that dovecot
errors out if I try to create a subfolder called
                            </div>
                            <div class="gmail_attr">
                             'INBOX' but it'll happily create a
subfolder called INBOX.SomethingElse (i.e. a folder called
                            </div>
                            <div class="gmail_attr">
                             INBOX.INBOX.SomethingElse - resulting in a
directory called .INBOX.SomethingElse on the
                            </div>
                            <div class="gmail_attr">
                             filesystem, and leading to the problem described
below). Is that sub-subfolder creation (where
                            </div>
                            <div class="gmail_attr">
                             the top level subfolder matches the namespace name)
supposed to be allowed? It seems
                            </div>
                            <div class="gmail_attr">
                             odd that 'INBOX' (as a subfolder of INBOX)
would be blocked but INBOX.SomethingElse (as
                            </div>
                            <div class="gmail_attr">
                             a subfolder of INBOX) would be allowed. I'd
expect INBOX.SomethingElse (i.e.
                            </div>
                            <div class="gmail_attr">
                             INBOX.INBOX.SomethingElse) would be blocked as
well.
                            </div>
                            <div class="gmail_attr">
                             <br>
                            </div>
                            <div class="gmail_attr"
dir="ltr">
                             <br>
                            </div>
                            <div class="gmail_attr"
dir="ltr">
                             On Wed, Mar 13, 2019 at 4:46 AM Bernd Wurst via
dovecot <
                             <a target="_blank"
href="mailto:dovecot@dovecot.org"
rel="noopener">dovecot@dovecot.org</a>> wrote:
                             <br>
                            </div>
                            <blockquote>
                             Hello,
                             <br>
                             <br>we're operating dovecot on a small
server. Some years ago, we migrated
                             <br>from courier IMAP to dovecot. Therefore,
we defined our default
                             <br>Namespace "inbox" with prefix
"INBOX." to have this compatible. I found
                             <br>this in some migration docs those days.
Generally, everything worked as
                             <br>expected.
                             <br>
                             <br>Our only namespace is configured like
this:
                             <br>
                             <br>namespace inbox {
                             <br> separator = .
                             <br>  prefix = INBOX.
                             <br>  inbox = yes
                             <br>}
                             <br>
                             <br>Regularly, there is no folder named INBOX
or .INBOX in the file system,
                             <br>I suppose this is correct.  But I found a
special corner case today when
                             <br>it comes to quota calculation.
                             <br>
                             <br>When - for whatever reason - a folder
.INBOX.foo (for arbitrary values
                             <br>of foo) exists, the whole mailbox is
counted twice in quota
                             <br>recalculation. Just creating .INBOX does
nothing but a subfolder
                             <br>triggers the problem.
                             <br>
                             <br>This is my shell view (replaced username
and file path and deleted
                             <br>unnecessary debug output)
                             <br>
                             <br>$ cat maildirsize
                             <br>268435456S
                             <br>14697 17
                             <br>$ maildirmake .INBOX.foo
                             <br>$ sudo doveadm -D quota recalc -u
<user>
                             <br>[...]
                             <br>doveadm(<user>): Debug: Namespace
inbox: type=private, prefix=INBOX.,
                             <br>sep=., inbox=yes, hidden=no, list=yes,
subscriptions=yes
                             <br>location=maildir:/home/.../test
                             <br>doveadm(<user>): Debug: maildir++:
root=/home/.../test, index=,
                             <br>indexpvt=, control=,
inbox=/home/.../test, alt                            
<br>doveadm(<user>): Debug: Namespace : type=private, prefix=, sep=,
                             <br>inbox=no, hidden=yes, list=no,
subscriptions=no location=fail::LAYOUT=none
                             <br>doveadm(<user>): Debug: none:
root=, index=, indexpvt=, control=,
                             <br>inbox=, alt                            
<br>doveadm(<user>): Debug: quota: quota_over_flag check:
quota_over_script
                             <br>unset - skipping
                             <br>doveadm(<user>): Debug: Quota root
User quota: Recalculated relative
                             <br>rules with bytes=268435456 count=0. Now
grace=26843545
                             <br>doveadm(<user>): Debug: Namespace
INBOX.: Using permissions from
                             <br>/home/.../test: mode=0700 gid=default
                             <br>
                             <br>$ cat maildirsize
                             <br>268435456S
                             <br>29394 34
                             <br>
                             <br>
                             <br>So the used quota has exactly been
doubled by just creating an empty
                             <br>subfolder.
                             <br>
                             <br>Do you have any pointers for fixing my
configuration or is this a bug in
                             <br>dovecot?
                             <br>
                             <br>
                            </blockquote>
                            <div>
                             <br>
                            </div>
                           </div>
                          </div>
                          <div>
                           I coincidentally resurrected a months-old thread with
this same issue a few days ago. I'm seeing the exact same after upgrading
from 2.2.32 to 2.2.36.
                          </div>
                          <div>
                           <br>
                          </div>
                          <div>
                           The original poster (who also narrowed it down to
something in 2.2.34) mentioned a workaround that does indeed work, namely
setting mailbox_list_index=no:
                          </div>
                          <div>
                           <br>
                          </div>
                          <div>
                           > doveadm -o 'mailbox_list_index=no' quota
recalc -u myuser
                           <br>
                          </div>
                          <div>
                           <br>
                          </div>
                          <div>
                           I've been staring at diffs of 2.2.33 and 2.2.34
without anything jumping out at me (not a C guy, sadly). Maybe
src/lib-storage/index/index-storage.c or
src/lib-storage/list/mailbox-list-fs-iter.c or
src/lib-storage/list/mailbox-list-index-iter.c or
src/lib-storage/list/mailbox-list-index.c?
                          </div>
                          <div>
                           <br>
                          </div>
                          <div>
                           The latter few have some added strcmp's against
"INBOX". Then again, there's a lot of new code in the diffs under
src/lib-storage that references INBOX specifically.
                          </div>
                         </div>
                        </div>
                       </div>
                      </div>
                     </div>
                    </div>
                   </div>
                  </div>
                 </div>
                </div>
               </div>
              </div>
             </div>
            </div>
           </div>
          </blockquote>
          <div>
           <br>
          </div>
          <div>
           Can the Dovecot team confirm whether this is indeed a bug or not? 
I've not yet been able to test 2.3.x to see if the problem exists there as
well.
           <br>
          </div>
         </div>
        </div>
       </blockquote>
       <div>
        <br>
       </div>
       <div>
        I've bisected this down to this commit: 
       </div>
       <div>
        <br>
       </div>
       <div>
        git diff
7620195ceeea805137cbd1bae104e385eee474a9..97473a513feb2bbd763051869c8b7b83e24b37fa
       </div>
       <div>
        <br>
       </div>
       <div>
        diff --git a/src/lib-storage/list/mailbox-list-index-iter.c
b/src/lib-storage/list/mailbox-list-index-iter.c
       </div>
       <div>
        index c9afc7a..49cd941 100644
       </div>
       <div>
        --- a/src/lib-storage/list/mailbox-list-index-iter.c
       </div>
       <div>
        +++ b/src/lib-storage/list/mailbox-list-index-iter.c
       </div>
       <div>
        @@ -90,13 +90,18 @@ mailbox_list_index_update_info(struct
mailbox_list_index_iterate_context *ctx)
       </div>
       <div>
                if (strcmp(ctx->info.vname, "INBOX") != 0) {
       </div>
       <div>
                        /* non-INBOX */
       </div>
       <div>
                        ctx->info.vname = p_strdup(ctx->info_pool,
ctx->info.vname);
       </div>
       <div>
        -       } else {
       </div>
       <div>
        +       } else if (!ctx->prefix_inbox_list) {
       </div>
       <div>
                        /* listing INBOX itself */
       </div>
       <div>
                        ctx->info.vname = "INBOX";
       </div>
       <div>
                        if
(mail_namespace_is_inbox_noinferiors(ctx->info.ns)) {
       </div>
       <div>
                                ctx->info.flags &=
~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN);
       </div>
       <div>
                                ctx->info.flags |= MAILBOX_NOINFERIORS;
       </div>
       <div>
                        }
       </div>
       <div>
        +       } else {
       </div>
       <div>
        +               /* listing INBOX/INBOX */
       </div>
       <div>
        +               ctx->info.vname = p_strconcat(ctx->info_pool,
       </div>
       <div>
        +                       ctx->ctx.list->ns->prefix,
"INBOX", NULL);
       </div>
       <div>
        +               ctx->info.flags |= MAILBOX_NONEXISTENT;
       </div>
       <div>
                }
       </div>
       <div>
                if ((node->flags & MAILBOX_LIST_INDEX_FLAG_NONEXISTENT)
!= 0)
       </div>
       <div>
                        ctx->info.flags |= MAILBOX_NONEXISTENT;
       </div>
       <div>
        @@ -126,6 +131,14 @@ mailbox_list_index_update_next(struct
mailbox_list_index_iterate_context *ctx,
       </div>
       <div>
         {
       </div>
       <div>
                struct mailbox_list_index_node *node = ctx->next_node;
       </div>
       <div>
        <br>
       </div>
       <div>
        +       if (!ctx->prefix_inbox_list &&
ctx->ctx.list->ns->prefix_len > 0 &&
       </div>
       <div>
        +           strcmp(node->name, "INBOX") == 0 &&
node->parent == NULL &&
       </div>
       <div>
        +           node->children != NULL) {
       </div>
       <div>
        +               /* prefix/INBOX has children */
       </div>
       <div>
        +               ctx->prefix_inbox_list = TRUE;
       </div>
       <div>
        +               return;
       </div>
       <div>
        +       }
       </div>
       <div>
        +
       </div>
       <div>
                if (node->children != NULL && follow_children) {
       </div>
       <div>
                        ctx->parent_len = str_len(ctx->path);
       </div>
       <div>
                        ctx->next_node = node->children;
       </div>
       <div>
        diff --git a/src/lib-storage/list/mailbox-list-index.h
b/src/lib-storage/list/mailbox-list-index.h
       </div>
       <div>
        index 9dc1c48..e4b042a 100644
       </div>
       <div>
        --- a/src/lib-storage/list/mailbox-list-index.h
       </div>
       <div>
        +++ b/src/lib-storage/list/mailbox-list-index.h
       </div>
       <div>
        @@ -138,6 +138,7 @@ struct mailbox_list_index_iterate_context {
       </div>
       <div>
                struct mailbox_list_index_node *next_node;
       </div>
       <div>
        <br>
       </div>
       <div>
                unsigned int failed:1;
       </div>
       <div>
        +       unsigned int prefix_inbox_list:1;
       </div>
       <div>
         };
       </div>
       <div>
        <br>
       </div>
       <div>
         extern MODULE_CONTEXT_DEFINE(mailbox_list_index_module, 
       </div>
       <div>
        <br>
       </div>
       <div>
        <br>
       </div>
       <div>
        Prior to this commit, anything updating the quota would do the right
thing for any .INBOX.<something> folders (i.e. not double count the
contents of "INBOX" against the quota). After this commit, anything
updating quota (new mail, quota recalc, etc) does the double counting of INBOX.
       </div>
      </div>
     </div>
    </div>
   </div>
  </blockquote>
  <div>
   <br>
  </div>
  <div>
   Thank you for the bisect! We'll look into this.
  </div>
  <div class="io-ox-signature">
   <pre>---
Aki Tuomi</pre>
  </div> 
 </body>
</html>
Mark Moseley
2019-Aug-06  18:08 UTC
[BUG?] Double quota calulation when special folder is present
On Tue, Apr 9, 2019 at 9:52 PM Aki Tuomi <aki.tuomi at open-xchange.com> wrote:> > On 10 April 2019 05:00 Mark Moseley via dovecot <dovecot at dovecot.org> > wrote: > > > On Wed, Apr 3, 2019 at 9:37 PM Mark Moseley < moseleymark at gmail.com> > wrote: > > > On Wed, Mar 20, 2019 at 2:13 PM Mark Moseley < moseleymark at gmail.com> > wrote: > > Just hoping to get some dev eyes on this. I'm incredibly reluctant to > throw the word 'bug' around > (since 99 times out of 100, it's not -- it's almost always the config), > but I can't think of any way > that this could be a config issue, esp when the pre-2.2.34 version works > as expected. > > I noticed during troubleshooting that dovecot errors out if I try to > create a subfolder called > 'INBOX' but it'll happily create a subfolder called INBOX.SomethingElse > (i.e. a folder called > INBOX.INBOX.SomethingElse - resulting in a directory called > .INBOX.SomethingElse on the > filesystem, and leading to the problem described below). Is that > sub-subfolder creation (where > the top level subfolder matches the namespace name) supposed to be > allowed? It seems > odd that 'INBOX' (as a subfolder of INBOX) would be blocked but > INBOX.SomethingElse (as > a subfolder of INBOX) would be allowed. I'd expect INBOX.SomethingElse > (i.e. > INBOX.INBOX.SomethingElse) would be blocked as well. > > > On Wed, Mar 13, 2019 at 4:46 AM Bernd Wurst via dovecot < > dovecot at dovecot.org> wrote: > > Hello, > > we're operating dovecot on a small server. Some years ago, we migrated > from courier IMAP to dovecot. Therefore, we defined our default > Namespace "inbox" with prefix "INBOX." to have this compatible. I found > this in some migration docs those days. Generally, everything worked as > expected. > > Our only namespace is configured like this: > > namespace inbox { > separator = . > prefix = INBOX. > inbox = yes > } > > Regularly, there is no folder named INBOX or .INBOX in the file system, > I suppose this is correct. But I found a special corner case today when > it comes to quota calculation. > > When - for whatever reason - a folder .INBOX.foo (for arbitrary values > of foo) exists, the whole mailbox is counted twice in quota > recalculation. Just creating .INBOX does nothing but a subfolder > triggers the problem. > > This is my shell view (replaced username and file path and deleted > unnecessary debug output) > > $ cat maildirsize > 268435456S > 14697 17 > $ maildirmake .INBOX.foo > $ sudo doveadm -D quota recalc -u <user> > [...] > doveadm(<user>): Debug: Namespace inbox: type=private, prefix=INBOX., > sep=., inbox=yes, hidden=no, list=yes, subscriptions=yes > location=maildir:/home/.../test > doveadm(<user>): Debug: maildir++: root=/home/.../test, index=, > indexpvt=, control=, inbox=/home/.../test, alt> doveadm(<user>): Debug: Namespace : type=private, prefix=, sep=, > inbox=no, hidden=yes, list=no, subscriptions=no location=fail::LAYOUT=none > doveadm(<user>): Debug: none: root=, index=, indexpvt=, control=, > inbox=, alt> doveadm(<user>): Debug: quota: quota_over_flag check: quota_over_script > unset - skipping > doveadm(<user>): Debug: Quota root User quota: Recalculated relative > rules with bytes=268435456 count=0. Now grace=26843545 > doveadm(<user>): Debug: Namespace INBOX.: Using permissions from > /home/.../test: mode=0700 gid=default > > $ cat maildirsize > 268435456S > 29394 34 > > > So the used quota has exactly been doubled by just creating an empty > subfolder. > > Do you have any pointers for fixing my configuration or is this a bug in > dovecot? > > > I coincidentally resurrected a months-old thread with this same issue a > few days ago. I'm seeing the exact same after upgrading from 2.2.32 to > 2.2.36. > > The original poster (who also narrowed it down to something in 2.2.34) > mentioned a workaround that does indeed work, namely setting > mailbox_list_index=no: > > > doveadm -o 'mailbox_list_index=no' quota recalc -u myuser > > I've been staring at diffs of 2.2.33 and 2.2.34 without anything jumping > out at me (not a C guy, sadly). Maybe src/lib-storage/index/index-storage.c > or src/lib-storage/list/mailbox-list-fs-iter.c or > src/lib-storage/list/mailbox-list-index-iter.c > or src/lib-storage/list/mailbox-list-index.c? > > The latter few have some added strcmp's against "INBOX". Then again, > there's a lot of new code in the diffs under src/lib-storage that > references INBOX specifically. > > > Can the Dovecot team confirm whether this is indeed a bug or not? I've > not yet been able to test 2.3.x to see if the problem exists there as well. > > > I've bisected this down to this commit: > > git diff > 7620195ceeea805137cbd1bae104e385eee474a9..97473a513feb2bbd763051869c8b7b83e24b37fa > > > diff --git a/src/lib-storage/list/mailbox-list-index-iter.c > b/src/lib-storage/list/mailbox-list-index-iter.c > index c9afc7a..49cd941 100644 > --- a/src/lib-storage/list/mailbox-list-index-iter.c > +++ b/src/lib-storage/list/mailbox-list-index-iter.c > @@ -90,13 +90,18 @@ mailbox_list_index_update_info(struct > mailbox_list_index_iterate_context *ctx) > if (strcmp(ctx->info.vname, "INBOX") != 0) { > /* non-INBOX */ > ctx->info.vname = p_strdup(ctx->info_pool, > ctx->info.vname); > - } else { > + } else if (!ctx->prefix_inbox_list) { > /* listing INBOX itself */ > ctx->info.vname = "INBOX"; > if (mail_namespace_is_inbox_noinferiors(ctx->info.ns)) { > ctx->info.flags &> ~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN); > ctx->info.flags |= MAILBOX_NOINFERIORS; > } > + } else { > + /* listing INBOX/INBOX */ > + ctx->info.vname = p_strconcat(ctx->info_pool, > + ctx->ctx.list->ns->prefix, "INBOX", NULL); > + ctx->info.flags |= MAILBOX_NONEXISTENT; > } > if ((node->flags & MAILBOX_LIST_INDEX_FLAG_NONEXISTENT) != 0) > ctx->info.flags |= MAILBOX_NONEXISTENT; > @@ -126,6 +131,14 @@ mailbox_list_index_update_next(struct > mailbox_list_index_iterate_context *ctx, > { > struct mailbox_list_index_node *node = ctx->next_node; > > + if (!ctx->prefix_inbox_list && ctx->ctx.list->ns->prefix_len > 0 > && > + strcmp(node->name, "INBOX") == 0 && node->parent == NULL && > + node->children != NULL) { > + /* prefix/INBOX has children */ > + ctx->prefix_inbox_list = TRUE; > + return; > + } > + > if (node->children != NULL && follow_children) { > ctx->parent_len = str_len(ctx->path); > ctx->next_node = node->children; > diff --git a/src/lib-storage/list/mailbox-list-index.h > b/src/lib-storage/list/mailbox-list-index.h > index 9dc1c48..e4b042a 100644 > --- a/src/lib-storage/list/mailbox-list-index.h > +++ b/src/lib-storage/list/mailbox-list-index.h > @@ -138,6 +138,7 @@ struct mailbox_list_index_iterate_context { > struct mailbox_list_index_node *next_node; > > unsigned int failed:1; > + unsigned int prefix_inbox_list:1; > }; > > extern MODULE_CONTEXT_DEFINE(mailbox_list_index_module, > > > Prior to this commit, anything updating the quota would do the right thing > for any .INBOX.<something> folders (i.e. not double count the contents of > "INBOX" against the quota). After this commit, anything updating quota (new > mail, quota recalc, etc) does the double counting of INBOX. > > > Thank you for the bisect! We'll look into this. > > --- > Aki Tuomi > >Hi. I was curious if there were any fixes for this? We're still affected by this (and I imagine others are too but don't realize it). Thanks! -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://dovecot.org/pipermail/dovecot/attachments/20190806/caeebe0b/attachment-0001.html>
Apparently Analagous Threads
- [BUG?] Double quota calulation when special folder is present
- [BUG?] Double quota calulation when special folder is present
- [BUG?] Double quota calulation when special folder is present
- [BUG?] Double quota calulation when special folder is present
- Double quota calulation when special folder is present