2016-03-22 19 views
5

Khi tôi cố gắng để tải lên một tập tin media thông qua giao diện django admin, tôi nhận được lỗi này:OSerror khi tải lên tập tin trên một NFS

OSError: [Errno 45] Operation not supported 

Đây là dòng cuối cùng của 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) 

Tôi tìm thấy this answer và một trong các nhận xét đã dẫn tôi đến this ticket và sau đó đến this commit, được giới thiệu trong vé dưới dạng "cách giải quyết" (xem bên dưới).

Đây là thay đổi tôi nên thực hiện trong django/core/files/locks.py theo giải pháp thay thế.

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) 

Tôi cố gắng để tự đảo ngược các thay đổi từ này cam kết (thay thế flock() cuộc gọi với lockf() cuộc gọi), nhưng nó tôi vẫn nhận được lỗi tương tự. Ngoài ra còn có các bản vá lỗi, nhưng các bản vá lỗi này dường như cũ (~ 7 tuổi và tôi sử dụng django 1.9 với python 3.5).

Tôi làm cách nào để giải quyết vấn đề này?

EDIT:

Như plombix đề cập, thư mục chính của tôi được gắn trên một NFS.

EDIT2:

Tôi cũng đã cố gắng để thay thế cho bầy gọi với fcntl.fcntl() cuộc gọi và tôi đã nhận một lỗi khác nhau:

OSError: [Errno 14] Bad address 
+1

dokterbob của chi nhánh [có này cam kết] (https://github.com/dokterbob/django/commit/bbc5118190fc52e4386a530b03adf00ba7e4c306), từ các ý kiến về vấn đề này, điều này chỉ đơn giản cho phép đi qua một thực hiện khóa. Bây giờ bạn cần phải tìm một trong đó làm việc cho AFP gắn kết. – tutuDajuju

Trả lời

1

Bạn có thể muốn xác định rằng bạn đang ở trên một hệ thống tập tin NFS ; P

lockf == bầy UNSUPORTED bởi NFS

cf bài khác trong ngăn xếp "flock vs lockf"

Nếu ngữ nghĩa (hành vi trên qua mô tả, forking, vv) là chấp nhận được, bạn nên thích lockf()/fcntl() ổ khóa trên bầy().

Ổ khóa trong Linux, đơn giản là vì trước đây hoạt động trên hệ thống tệp NFS, v.v. trong khi hệ thống tệp sau không hoạt động.

Trên BSD và Mac OS X, tôi tin rằng bạn cần sử dụng rõ ràng fcntl(), thay vào đó.

tôi đề nghị bạn chuyển hướng hoạt động của bạn trên/temp hoặc/goinfre/

Các vấn đề liên quan