Armazenamento estável CLFS

Quando você grava um registro em um fluxo CLFS (Common Log File System), o registro é colocado em um bloco de E/S de log (em uma área de marshaling) na memória volátil. Periodicamente, o CLFS libera blocos de E/S de log da área de marshaling para o armazenamento estável, como um disco. No dispositivo de armazenamento estável, o log consiste em um conjunto de contêineres, cada um deles uma extensão contígua no meio físico. Uma coleção de contêineres que forma o armazenamento estável para um fluxo é chamada de log ou log físico.

A figura a seguir ilustra um contêiner.

diagrama ilustrando contêineres, blocos e registros.

A figura anterior ilustra um contêiner que contém três blocos de E/S de log. O primeiro bloco de E/S de log contém três registros, o segundo contém cinco registros e o terceiro contém dois registros. Como a figura sugere, o início de cada bloco de E/S de log é sempre alinhado com o início de um setor na mídia de armazenamento estável. Observe que os blocos de E/S de log no armazenamento estável variam de tamanho.

O CLFS usa um conjunto de três números para localizar um registro em um log.

  • O identificador de contêiner identifica o contêiner que contém o registro.

  • O deslocamento de bloco fornece o deslocamento de bytes, dentro do contêiner, do início do bloco de E/S de log que contém o registro.

  • O número da sequência de registros identifica o registro dentro do bloco de E/S de log.

O LSN (número de sequência de log) de um registro de log CLFS realmente contém essas três informações: identificador de contêiner, deslocamento de bloco e número de sequência de registro. No entanto, os LSNs dados aos clientes de log contêm identificadores de contêiner lógicos que o CLFS deve mapear para identificadores de contêiner físico antes de acessar os registros no armazenamento estável.

O CLFS usa identificadores de contêiner lógico para dar aos clientes a exibição de que os registros de log estão sendo gravados em uma sequência contínua de contêineres, quando, na verdade, os contêineres físicos estão sendo reciclados.

Suponha que um log tenha três contêineres e um único cliente esteja gravando registros CLFS no log. O cenário a seguir mostra como um contêiner pode ser reciclado.

  1. O cliente grava registros de log suficientes para preencher todos os três contêineres.

  2. O cliente define a base de log (chamando ClfsAdvanceLogBase ou ClfsWriteRestartArea.) como um dos registros no contêiner 2. Ao fazer isso, o cliente está dizendo que não precisa mais dos registros no contêiner 1.

  3. O cliente grava outro registro no log e obtém de volta o LSN do registro recém-gravado. O identificador de contêiner lógico nesse LSN é 4. Quando os registros são liberados para o armazenamento estável, os registros que o cliente vê no contêiner lógico 4 vão para o contêiner físico 1.

A figura a seguir ilustra o cenário; mostra como a sequência de clientes de contêineres lógicos é mapeada para contêineres físicos no armazenamento estável.

diagrama ilustrando contêineres lógicos e físicos.

O identificador de contêiner lógico, o deslocamento de bloco e o número da sequência de registros são armazenados em um LSN de forma que os LSNs de um fluxo específico sempre formem uma sequência estritamente crescente. Ou seja, o LSN (com identificador de contêiner lógico) de um registro de log gravado em um fluxo é sempre maior que os LSNs dos registros de log gravados anteriormente nesse mesmo fluxo. Os LSNs, em seguida, atendem a uma finalidade dupla: 1) eles dão aos clientes de um fluxo uma sequência ordenada de identificadores de registro e 2) fornecem ao CLFS o local dos registros no armazenamento estável.

Considerando o LSN de um registro, você pode extrair o identificador de contêiner lógico, o deslocamento do bloco e o número da sequência de registros chamando as funções a seguir.

ClfsLsnContainer

ClfsLsnBlockOffset

ClfsLsnRecordSequence

O identificador de contêiner lógico é um número de 32 bits, portanto, há 2^32 possíveis identificadores de contêiner lógico e eles estão no intervalo 0x0 até 0xFFFFFFFF. Um fluxo pode ter no máximo 2^32 contêineres lógicos.

O deslocamento de bloco é armazenado em 23 bits do LSN, mas ClfsLsnBlockOffset retorna um número de 32 bits alinhado com o tamanho do setor da mídia de armazenamento estável. O deslocamento de bloco é sempre um múltiplo de 512. Além disso, o deslocamento de bloco é alinhado com o tamanho do setor da mídia de armazenamento estável. Por exemplo, se o tamanho do setor for de 1024 bytes, o deslocamento do bloco será um múltiplo de 1024.

O número de sequência de registro é um número de 9 bits, portanto, há 2^9 (512) números de sequência de registro possíveis e eles estão no intervalo 0x0 até 0x1FF. Um bloco de E/S de log pode ter no máximo 512 registros.