2016-03-22 25 views
5

Quando provo a caricare un file media attraverso l'interfaccia di Django di amministrazione, ottengo questo errore:OSError durante il caricamento di file su un NFS

OSError: [Errno 45] Operation not supported 

Ecco l'ultima riga della traceback:

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) 

Ho trovato this answer e uno dei commenti mi ha portato a this ticket e quindi a this commit, introdotto nel ticket come "soluzione" (vedi sotto).

Ecco le modifiche che dovrei fare in django/core/files/locks.py in base alla soluzione alternativa.

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) 

Ho cercato di invertire manualmente le modifiche da questo commit (sostituendo flock() chiamate con lockf() chiamate), ma ancora ottengo lo stesso errore. Ci sono anche patch, ma queste patch sembrano vecchie (~ 7 anni e uso django 1.9 con python 3.5).

Come posso risolvere questo?

EDIT:

Come plombix detto, la mia home directory è montato su un NFS.

EDIT2:

Ho anche provato a sostituire il gregge chiamate con fcntl.fcntl() chiamate e ho ottenuto un errore diverso:

OSError: [Errno 14] Bad address 
+1

ramo di dokterbob [ha questo commettere] (https://github.com/dokterbob/django/commit/bbc5118190fc52e4386a530b03adf00ba7e4c306), dai commenti sul problema, questo semplicemente consente di passare un'implementazione di blocco. Ora devi trovarne uno che funzioni per i supporti AFP. – tutuDajuju

risposta

1

si consiglia di specificare che siete su un file system NFS ; P

lockf == gregge UNSUPORTED da NFS

cf altro post in stack "flock vs lockf"

Se la semantica (comportamento nel descrittore di passaggio, si biforcano, ecc) è accettabile, si dovrebbe preferire lockf()/fcntl() serrature oltre flock().

I blocchi in Linux, semplicemente perché il primo funziona su file system NFS ecc., Mentre il secondo no.

Su BSD e Mac OS X, credo che sia necessario utilizzare esplicitamente fcntl(), invece.

vi consiglio di reindirizzare le operazioni sopra/temp o/Goinfre/