2016-03-22 1 views
5

Lorsque je tente de télécharger un fichier multimédia via l'interface admin django, je reçois cette erreur:OSError lors du téléchargement des fichiers sur un NFS

OSError: [Errno 45] Operation not supported 

Voici la dernière ligne du retraçage:

File "/path/to/home/Envs/myenv/lib/python3.5/site-packages/django/core/files/locks.py", line 112, in unlock 
    ret = fcntl.lockf(_fd(f), fcntl.LOCK_UN) 

J'ai trouvé this answer et l'un des commentaires m'a conduit à this ticket, puis à this commit, introduit dans le ticket comme une «solution de contournement» (voir ci-dessous).

Voici les modifications que je devrais faire dans django/core/files/locks.py selon la solution de contournement.

elif system_type == 'posix': 
    def lock(file, flags): 
-  fcntl.flock(fd(file), flags) 
+  fcntl.lockf(fd(file), flags) 

    def unlock(file): 
-  fcntl.flock(fd(file), fcntl.LOCK_UN) 
+  fcntl.lockf(fd(file), fcntl.LOCK_UN) 

J'ai essayé d'inverser manuellement les modifications de ce commit (remplacement flock() appels avec lockf() appels), mais je reçois toujours la même erreur. Il y a aussi des correctifs, mais ces correctifs semblent vieux (~ 7 ans et j'utilise django 1.9 avec python 3.5).

Comment pourrais-je résoudre ce problème?

EDIT:

Comme mentionné plombix, mon répertoire est monté sur un NFS.

EDIT2:

J'ai aussi essayé de remplacer le troupeau appelle avec fcntl.fcntl() appels et je suis une autre erreur:

OSError: [Errno 14] Bad address 
+1

branche de dokterbob [a] ce commit (https://github.com/dokterbob/django/commit/bbc5118190fc52e4386a530b03adf00ba7e4c306), des commentaires sur la question, cela permet simplement de passer une implémentation de verrouillage. Vous devez maintenant en trouver un qui fonctionne pour les montages AFP. – tutuDajuju

Répondre

1

Vous pouvez spécifier que vous êtes sur un système de fichiers NFS ; P

lockf == troupeau UNSUPORTED par NFS

cf autre poste dans la pile "flock vs lockf"

Si la sémantique (comportement sur le passage du descripteur, bifurquer, etc.) est acceptable, vous devriez préférer lockf()/serrures fcntl() sur flock().

Verrouille sous Linux, simplement parce que le premier fonctionne sur les systèmes de fichiers NFS etc., alors que ce dernier ne fonctionne pas.

Sur BSD et Mac OS X, je crois que vous devez utiliser fcntl() à la place.

je vous suggère de rediriger vos opérations sur temp/ou/goinfre/