2016-08-03 15 views
1

Ich habe Probleme mit Python-Sicherung. Hier ist ein eigenständiges Beispiel für die Ausgabe: https://gist.github.com/ensonic/87e4108a7be64412d1c5a553b7e01f88Doppel lesen Anrufe in Python-Sicherung führt zu EINVAL

Wenn die gefälschte-in-Speicher-Dateisystem Montage kann ich den Inhalt auflisten, aber ich kann die Dateien lesen:

> ls -al ~/temp/mount/ 
total 1 
-r--r--r-- 1 user group 34 Aug 3 22:44 test.txt 
> cat ~/temp/mount/test.txt 
cat: /home/user/temp/mount/test.txt: Invalid argument 

Wenn ich die Sicherung laufen fs im forground (-d), erhalte ich diese Debug-Info:

LOOKUP /test.txt 
getattr /test.txt 
    NODEID: 2 
    unique: 120, success, outsize: 144 
unique: 121, opcode: OPEN (14), nodeid: 2, insize: 48, pid: 10342 
open flags: 0x8000 /test.txt 
    open[0] flags: 0x8000 /test.txt 
    unique: 121, success, outsize: 32 
unique: 122, opcode: READ (15), nodeid: 2, insize: 80, pid: 10342 
read[0] 4096 bytes from 0 flags: 0x8000 
    unique: 122, error: -22 (Invalid argument), outsize: 16 
unique: 123, opcode: READ (15), nodeid: 2, insize: 80, pid: 10342 
read[0] 4096 bytes from 0 flags: 0x8000 
    unique: 123, error: -22 (Invalid argument), outsize: 16 
unique: 124, opcode: FLUSH (25), nodeid: 2, insize: 64, pid: 10342 
    unique: 124, error: -38 (Function not implemented), outsize: 16 
unique: 125, opcode: RELEASE (18), nodeid: 2, insize: 64, pid: 0 
release[0] flags: 0x8000 
    unique: 125, success, outsize: 16 

und mein Logfile hat:

INFO:fakefs:open fake file /test.txt 
INFO:fakefs:read from /test.txt, offs 0, size 4096, len 34 
INFO:fakefs:read remainder 
INFO:fakefs:read() = 34 bytes 
INFO:fakefs:read from /test.txt, offs 0, size 4096, len 34 
INFO:fakefs:read remainder 
INFO:fakefs:read() = 34 bytes 
INFO:fakefs:released(/test.txt) = 0 

Was ich frage ist: 1) Warum ist das Lesen zweimal getan (lesen [0] 4096 Bytes von 0 Flags: 0x8000) 2) Warum gibt es EINVAL? Ich gebe die Daten zurück - es gibt keinen einzigen EINVAL in meinem Code.

Im aktuellen Beispiel implementiere ich den Rest der fs Funktionen auch, das ist nicht das Problem.

Antwort

0

Stellt sich heraus, es ist mit der schwierigen Handhabung der Codierung in Python 2 verbunden (es gibt keine Python-Sicherung für py3).

Die Rückgabe von Bytes (buf) in read() behebt es. Der Sicherungscode verwendet EINVAL auch, wenn Dinge von der Python-Seite her schief gehen.