Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
dnbd3_fuse_cow [2022/09/08 16:59 CEST] – Schreibanfrage und Block-Upload mscherlednbd3_fuse_cow [2022/09/09 18:28 CEST] – Threads und Locks mscherle
Zeile 402: Zeile 402:
 Sobald das Image ausgehängt ist, wird COW_MIN_UPLOAD_DELAY ignoriert und alle Blöcke, die eine andere Zeit als 0 haben, werden hochgeladen. Sobald das Image ausgehängt ist, wird COW_MIN_UPLOAD_DELAY ignoriert und alle Blöcke, die eine andere Zeit als 0 haben, werden hochgeladen.
 Das Hochladen erfolgt über einen REST-Request. Es gibt zwei verschiedene Limits für die Anzahl der parallelen Uploads, diese können in der config.h konfiguriert werden. Das Hochladen erfolgt über einen REST-Request. Es gibt zwei verschiedene Limits für die Anzahl der parallelen Uploads, diese können in der config.h konfiguriert werden.
 +
 +===Dateien===
 +Wenn eine neue CoW-Sitzung gestartet wird, werden eine neue Meta-, Daten- und, falls in den Befehlszeilenargumenten festgelegt, eine status.txt-Datei erstellt.
 +
 +==status.txt==
 +Die Datei status.txt kann mit dem Kommandozeilenparameter --cowStatFile aktiviert werden.
 +
 +Die Datei enthält die folgende Informationen:
 +<code>
 +uuid=<uuid>
 +state=backgroundUpload
 +inQueue=0
 +modifiedBlocks=0
 +idleBlocks=0
 +totalBlocksUploaded=0
 +activeUploads:0
 +ulspeed=0.00
 +</code>
 +
 +  * Die **uuid** ist die Sitzungs-Uuid, die vom Cow-Server zur Identifizierung der Sitzung verwendet wird.
 +
 +  * Der **Status** ist **backgroundUpload**, wenn das Image noch eingehängt ist und die Cow- Blöcke im Hintergrund hochgeladen werden. Er ist **uploading**, wenn das Image ausgehängt wurde und alle noch nicht hochgeladenen Blöcke hochgeladen werden. Es ist **done**, wenn das Image ausgehängt wurde und alle Blöcke hochgeladen wurden.
 +
 +  * **Queue** sind die CoW Blöcke, die gerade hochgeladen werden oder auf einen freien Slot warten.
 +
 +  * **ModifiedBlocks** sind CoW Blöcke, die Änderungen aufweisen, die noch nicht auf den Server hochgeladen wurden, weil die Änderungen zu aktuell sind.
 +
 +  * **totalBlocksUploaded** die Gesamtanzahl der CoW Blöcke, die seit dem Einhängen des Images hochgeladen wurden.
 +
 +  * **activeUploads** ist die Anzahl der Blöcke, die gerade hochgeladen werden.
 +
 +  * **ulspeed** die aktuelle Upload-Geschwindigkeit in kb/s.
 +
 +Sobald alle Blöcke hochgeladen wurden, wird der Status auf erledigt gesetzt. Wenn Sie COW_DUMP_BLOCK_UPLOADS festlegen (in config.h), wird eine Liste aller Blöcke, sortiert nach der Anzahl der Uploads, in die Datei status.txt kopiert, nachdem der Block-Upload abgeschlossen ist.
 +
 +Mit dem Kommandozeilenparameter --cowStatStdout wird die gleiche Ausgabe der Statistikdatei in stdout ausgegeben.
 +
 +==meta==
 +Die Metadatei enthält die folgenden Header:
 +<code>
 +// cowfile.h
 +typedef struct cowfile_metadata_header
 +{
 +    uint64_t magicValue;                    // 8byte
 +    atomic_uint_least64_t imageSize;        // 8byte
 +    int32_t version;                        // 4byte
 +    int32_t blocksize;                      // 4byte
 +    uint64_t originalImageSize;             // 8byte
 +    uint64_t metaDataStart;                 // 8byte
 +    int32_t bitfieldSize;                   // 4byte
 +    int32_t nextL2;                         // 4byte
 +    atomic_uint_least64_t metadataFileSize; // 8byte
 +    atomic_uint_least64_t dataFileSize;     // 8byte
 +    uint64_t maxImageSize;                  // 8byte
 +    uint64_t creationTime;                  // 8byte
 +    char uuid[40];                          // 40byte
 +    char imageName[200];                    // 200byte
 +} cowfile_metadata_header_t;
 +</code>
 +Nach diesem Header beginnt bei Byte 8192 die oben erwähnte l1- und dann die l2-Datenstruktur.
 +==data==
 +Die Datendatei enthält den magicValue und am Offset 40 * 8 * 4096 (Kapazität eines cowfile_metadata_header_t) beginnt der erste Datenblock.
 +
 +==magic values in den Headern der Dateien==
 +Die magic values in beiden Dateien werden verwendet, um sicherzustellen, dass eine geeignete Datei gelesen wird und dass der Rechner die richtige Endianness hat.
 +<code>
 +//config.h
 +#define COW_FILE_META_MAGIC_VALUE ((uint64_t)0xEBE44D6E72F7825E) // Magic Value to recognize a Cow meta file
 +#define COW_FILE_DATA_MAGIC_VALUE ((uint64_t)0xEBE44D6E72F7825F) // Magic Value to recognize a Cow data file
 +</code>
 +
 +===Threads===
 +Diese Erweiterung verwendet zwei neue Threads:
 +<code>
 +tidCowUploader
 +tidStatUpdater
 +</code>
 +  * **tidCowUploader** ist der Thread, der die Blöcke auf den Cow-Server hochlädt.
 +
 +  * **tidStatUpdater** aktualisiert die Statistiken in stdout oder die Statistikdateien (je nach Parametern).
 +
 +===Locks===
 +Diese Erweiterung verwendet einen neuen Lock cow.l2CreateLock. Er wird verwendet, wenn ein neues L2-Array zugewiesen wird.
  
 <note warning>To do</note> <note warning>To do</note>
Drucken/exportieren