[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#7682) LMDB: [PATCH] mdb_env_copy should retry open() if O_DIRECT fails



On 2013-09-13 23:09, sog@msg.com.mx wrote:
> If the call fails because O_DIRECT, in a "tmpfs" in my Fedora 19 
> '/tmp',
> the file is left created anyway! so the retry fails because 
> O_EXCL|O_CREAT.

Also on RHEL 6.4 (2.6.32-358.18.1.el6.x86_64) with
/dev/shm/nosuch.  I'll report it to RedHat and see what they say.

> I propose the following:
> (...)
> +     * Fortunately seems that other errors are reported before EINVAL
> +     * So, we need to remove it before retry open.
>        */
>       if (newfd == INVALID_HANDLE_VALUE && ErrCode() == EINVAL)
> +        (void)unlink(lpath)  ,

No unlink(). EINVAL does not say whether the file existed
before the call. Not on another OS, nor on another Linux
version or filesystem where Linux may work differently.

Somewhat better: #ifdef <buggy Linux>, replace O_EXCL with
O_TRUNC in the 2nd call. Or add paranoia like taking an
exclusive lock, but ignore "locking not supported" errors.

>   #endif
>       newfd = open(lpath, O_WRONLY|O_CREAT|O_EXCL, 0666);
>   #endif

-- 
Hallvard