Freigeben über


STABILER CLFS-Speicher

Wenn Sie einen Datensatz in einen CLFS-Stream (Common Log File System) schreiben, wird der Datensatz in einem Protokoll-E/A-Block (in einem Marshallbereich) in flüchtigem Speicher platziert. In regelmäßigen Abständen leert CLFS Protokoll-E/A-Blöcke aus dem Marshallingbereich in stabilen Speicher, z. B. einen Datenträger. Auf dem stabilen Speichergerät besteht das Protokoll aus einer Gruppe von Containern, von denen jeder eine zusammenhängende Ausdehnung auf dem physischen Medium ist. Eine Sammlung von Containern, die den stabilen Speicher für einen Stream bilden, wird als Protokoll oder physisches Protokoll bezeichnet.

Die folgende Abbildung veranschaulicht einen Container.

Diagramm zur Veranschaulichung von Containern, Blöcken und Datensätzen.

Die vorherige Abbildung veranschaulicht einen Container mit drei Protokoll-E/A-Blöcken. Der erste Protokoll-E/A-Block enthält drei Datensätze, der zweite fünf Datensätze und der dritte enthält zwei Datensätze. Wie in der Abbildung dargestellt, ist der Anfang jedes Protokoll-E/A-Blocks immer am Anfang eines Sektors auf dem stabilen Speichermedium ausgerichtet. Beachten Sie, dass die Größe von Protokoll-E/A-Blöcken für stabilen Speicher variiert.

CLFS verwendet einen Satz von drei Zahlen, um einen Datensatz in einem Protokoll zu suchen.

  • Der Containerbezeichner identifiziert den Container, der den Datensatz enthält.

  • Der Blockoffset gibt den Byteoffset innerhalb des Containers am Anfang des Protokoll-E/A-Blocks an, der den Datensatz enthält.

  • Die Datensatzsequenznummer identifiziert den Datensatz innerhalb des Protokoll-E/A-Blocks.

Die Protokollsequenznummer (Log Sequence Number, LSN) eines CLFS-Protokolldatensatzes enthält tatsächlich diese drei Informationen: Containerbezeichner, Blockoffset und Datensatzsequenznummer. Die LSNs für Protokollclients enthalten jedoch logische Containerbezeichner , die CLFS physischen Containerbezeichnern zuordnen muss, bevor sie auf die Datensätze im stabilen Speicher zugreift.

CLFS verwendet logische Containerbezeichner, um Clients die Ansicht zu geben, dass Protokolldatensätze in eine fortlaufende Sequenz von Containern geschrieben werden, wenn die physischen Container tatsächlich wiederverwendet werden.

Angenommen, ein Protokoll enthält drei Container, und ein einzelner Client schreibt CLFS-Datensätze in das Protokoll. Das folgende Szenario zeigt, wie ein Container wiederverwendet werden kann.

  1. Der Client schreibt genügend Protokolldatensätze, um alle drei Container zu füllen.

  2. Der Client legt die Protokollbasis (durch Aufrufen von ClfsAdvanceLogBase oder ClfsWriteRestartArea.) auf einen der Datensätze in Container 2 fest. Dadurch sagt der Client, dass er die Datensätze in Container 1 nicht mehr benötigt.

  3. Der Client schreibt einen weiteren Datensatz in das Protokoll und ruft die LSN des neu geschriebenen Datensatzes zurück. Der logische Containerbezeichner in dieser LSN ist 4. Wenn Datensätze in einen stabilen Speicher geleert werden, werden Datensätze, die dem Client im logischen Container 4 angezeigt werden, an physischen Container 1 übergeben.

Die folgende Abbildung veranschaulicht das Szenario; Es zeigt, wie die Clientsequenz logischer Container physischen Containern in stabilem Speicher zugeordnet wird.

Diagramm zur Veranschaulichung logischer und physischer Container.

Der logische Containerbezeichner, der Blockoffset und die Datensatzsequenznummer werden in einer LSN so gespeichert, dass die LSNs für einen bestimmten Stream immer eine streng ansteigende Sequenz bilden. Das heißt, die LSN (mit logischem Containerbezeichner) eines in einen Datenstrom geschriebenen Protokolldatensatzes ist immer größer als die LSNs der Protokolldatensätze, die zuvor in denselben Stream geschrieben wurden. LSNs dienen also einem doppelten Zweck: 1) Sie geben den Clients eines Streams eine geordnete Sequenz von Datensatzbezeichnern, und 2) stellen sie CLFS den Speicherort von Datensätzen im stabilen Speicher bereit.

Angesichts der LSN eines Datensatzes können Sie den logischen Containerbezeichner, den Blockoffset und die Datensatzsequenznummer extrahieren, indem Sie die folgenden Funktionen aufrufen.

ClfsLsnContainer

ClfsLsnBlockOffset

ClfsLsnRecordSequence

Der logische Containerbezeichner ist eine 32-Bit-Zahl, sodass 2^32 mögliche logische Containerbezeichner vorhanden sind und sich im Bereich befinden, der bis 0xFFFFFFFF 0x0. Ein Stream kann höchstens 2^32 logische Container aufweisen.

Der Blockoffset wird in 23 Bits des LSN gespeichert, aber ClfsLsnBlockOffset gibt eine 32-Bit-Zahl zurück, die an der Sektorgröße des stabilen Speichermediums ausgerichtet ist. Der Blockoffset ist immer ein Vielfaches von 512. Außerdem wird der Blockoffset an der Sektorgröße des stabilen Speichermediums ausgerichtet. Wenn die Sektorgröße beispielsweise 1024 Byte beträgt, ist der Blockoffset ein Vielfaches von 1024.

Die Datensatzsequenznummer ist eine 9-Bit-Zahl, sodass es 2^9 (512) mögliche Datensatzsequenznummern gibt, und sie liegen im Bereich 0x0 bis 0x1FF. Ein Protokoll-E/A-Block kann höchstens 512 Datensätze enthalten.