This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: tempfile.TemporaryFile fails on NFS v4 filesystems
Type: Stage:
Components: Versions: Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: drosera, r.david.murray, vstinner
Priority: normal Keywords:

Created on 2014-09-02 12:00 by drosera, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (9)
msg226271 - (view) Author: Frank Thommen (drosera) Date: 2014-09-02 12:00
Hi,

tempfile.TemporaryFile fails on NFS v4 filesystems.

Assume the following mounts:

$ mount
[...]
psi:/volumes/vol1 on /mnt/nfsv4 type nfs4 (rw,addr=xx.xx.xx.xx)
psi:/volumes/vol1 on /mnt/nfsv3 type nfs (rw,addr=xx.xx.xx.xx)
[...]
$

and the following script "testtmpfile.py":

---------------
#! env python

import tempfile

def _is_writable_dir_unnamed(p):
    try:
        t = tempfile.TemporaryFile(dir=p)
        t.write('1')
        t.close()
    except OSError: return False
    else: return True


def _is_writable_dir_named(p):
    try:
        t = tempfile.NamedTemporaryFile(dir=p)
        t.write('1')
        t.close()
    except OSError: return False
    else: return True



if not _is_writable_dir_unnamed("."):
    print "(unnamed) . is not writable"
else:
   print "(unnamed) OK"


if not _is_writable_dir_named("."):
    print "(named) . is not writable"
else:
   print "(named) OK"
---------------


Then you'll find the following behaviour:

$ pwd
/mnt/nfsv4
$ /g/software/bin/python-2.7 /tmp/testtmpfile.py 
(unnamed) . is not writable
(named) OK
$

$ pwd
/mnt/nfsv3
$ /g/software/bin/python-2.7 /tmp/testtmpfile.py 
(unnamed) OK
(named) OK
$

Additionally in the failing case, a - writable - temporary file named "tmp*" is left in the directory.

Observed on CentOS 5.10 with kernel 2.6.18-371.11.1.el5 and on CentOS 6.5 with kernel 2.6.32-431.23.3.el6.x86_64.

The problem appears with Python 2.4, 2.6 and 2.7.


Cheers
frank
msg226273 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2014-09-02 12:39
What is the actual OSError raised?
msg226275 - (view) Author: Frank Thommen (drosera) Date: 2014-09-02 14:17
errno:    5
strerror: Input/output error
msg226276 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2014-09-02 14:23
I tried on my Fedora 20 (Linux, kernel 3.14.8-200.fc20.x86_64) and I'm unable to reproduce the issue.

$ sudo mkdir /test
$ sudo chown haypo: /test
$ echo "/test *(rw)" >> /etc/exports
$ sudo exportfs -af
$ sudo mount -t nfs localhost:/test nfs
$ cat > x.py
<copy/paste the code from the first message of this issue>
$ python x.py
(unnamed) OK
(named) OK
$ mount|grep nfs
localhost:/test on /home/haypo/nfs type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp6,port=0,timeo=600,retrans=2,sec=sys,clientaddr=::1,local_lock=none,addr=::1)
$ python -V
Python 2.7.5
msg226277 - (view) Author: Frank Thommen (drosera) Date: 2014-09-02 15:20
Agreed.  If I export from CentOS and mount on CentOS (local or remote) it seems to work.  So this is probably due to our specific fileserver setup or a problem of the underlying filesystem (zfs).
msg226628 - (view) Author: Frank Thommen (drosera) Date: 2014-09-09 08:33
It might be an issue of strict ACL mapping (http://wiki.linux-nfs.org/wiki/index.php/ACLs) is implemented.  On our ZFS based NFS v4 server this is the case, on CentOS based NFS v4 servers this doesn't seem to be implemented/enforced.

It becomes then still a Python problem, as tempfile.TemporaryFile is not generally usable any more.
msg226727 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2014-09-10 21:40
> It becomes then still a Python problem, as tempfile.TemporaryFile is not generally usable any more.

Well, it looks like you are the first one to complain, whereas the module is at least 10 years old. So it looks more like an issue in your setup (as you wrote), than a bug in Python.

Which syscalls fails with errno 5? Can you run your example with strace to identify the syscall?

*If* a patch should be written, we need to identify which Python line should be modified.
msg226990 - (view) Author: Frank Thommen (drosera) Date: 2014-09-17 09:35
strace gives me the error:

  unlink("/mnt/tmpu817xz") = -1 EIO (Input/output error)

But after escalating the issue to our server vendor it turned out that the problem lies in the filesystem option "nbmand".  If this option is set to "on" - which it seems to be by default on our zfs filesystems - and the filesystem is exported and mounted with NFS v4, then tempfile.TemporaryFile fails:

[...]
V4 Call (Reply In 167) RENAME From: tmpr0OaMb To: .nfs00000000000000270000af65
V4 Reply (Call In 166) RENAME Status: NFS4ERR_FILE_OPEN
[...]

I assume that this is nothing Python can check for and therefore not a Python problem.

Not sure what the policy is: Can I set the ticket to "solved" myself?
msg226991 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2014-09-17 10:15
>   unlink("/mnt/tmpu817xz") = -1 EIO (Input/output error)

If a system call can fail with EIO, I guess that not only Python is affected, by *any* program. So I don't see why Python should have a special case for broken filesystems.

I close the issue as "not a bug".
History
Date User Action Args
2022-04-11 14:58:07adminsetgithub: 66522
2014-09-17 10:15:21vstinnersetstatus: open -> closed
resolution: not a bug
messages: + msg226991
2014-09-17 09:35:49droserasetmessages: + msg226990
2014-09-10 21:40:15vstinnersetmessages: + msg226727
2014-09-09 08:33:39droserasetmessages: + msg226628
2014-09-02 15:20:02droserasetmessages: + msg226277
2014-09-02 14:23:54vstinnersetnosy: + vstinner
messages: + msg226276
2014-09-02 14:17:13droserasetmessages: + msg226275
2014-09-02 12:39:58r.david.murraysetnosy: + r.david.murray
messages: + msg226273
2014-09-02 12:00:06droseracreate