Re: fts-flatcurve 2.4.4: after "doveadm fts optimize" a mailbox stops indexing new mail (empty current.<id> shard, missing iamglass)

John Stoffel via dovecot <[email protected]>
Newsgroups gmane.mail.imap.dovecot
Message-ID <[email protected]>
>>>>> "Ihor" == Ihor Rusyn via dovecot <[email protected]> writes:

>    Quick update -- we can reproduce this reliably, specifically on NFS. We've
>    also tested the same optimize path on ext4 (local) and CephFS, and neither
>    shows the problem. Here's why we think that lines up:

>    The core issue is unlink()/rmdir() semantics for files/directories that
>    are still open by the calling process. On a local POSIX filesystem (ext4)
>    and on CephFS, unlinking a file that's still open by the same process is
>    fully supported: the directory entry is removed immediately, and the
>    file's data blocks stay allocated until the last file descriptor closes.
>    So rmdir() on the parent directory succeeds right away, because as far as
>    the filesystem is concerned the directory is already empty -- the
>    still-open file just has no name anymore.

>    NFS can't do that. There's no way for an NFS client to tell the server
>    "unlink this, but I still have it open." When a client unlinks a file it
>    still holds open, the NFS client silently works around it with what's
>    usually called "silly rename": instead of an actual unlink, it renames the
>    file to a hidden .nfsXXXX name, so the directory entry survives until the
>    file is finally closed and the client can clean it up. In
>    fts_flatcurve_xapian_optimize_box_do(), the shard's write handles are
>    still open when the old current.* directory is deleted -- fine on
>    ext4/CephFS, but on NFS it leaves .nfsXXXX entries behind, so the rmdir()
>    on that directory fails with ENOTEMPTY. That failure doesn't appear to be
>    surfaced anywhere -- unlink_directory() reports success regardless -- so
>    the directory is left behind, and once the open handles are eventually
>    closed, what remains is an empty current.* directory that is still treated
>    as the active shard.

To me this screams that when the rmdir() fails, instead of just
bailing, the code should move the directory to another name and then
create a new directory.

But I'm not sure if those .nfs### files every get cleaned up, so it
would have to be part of the scan, purge, clean process to go through
and remove those files by hand.  

So I personally love using NFS filesystems for storage, but I can see
how the semantics of the way the tool is written don't quite match how
NFS works in the real world.  

So the options could be:

1. Document clearly that this is not supported on NFS volumes

2. patch the code to handle it more gracefully (like I suggested
   above) 

3. Change how the code works to not depend on this rmdir() action at
   all.  


Just an interested bystander... :-)

John
_______________________________________________
dovecot mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.