Archiviazione stabile CLFS

Quando si scrive un record in un flusso CLFS (Common Log File System), il record viene inserito in un blocco di I/O del log (in un'area di marshalling) in memoria volatile. Periodicamente, CLFS scarica i blocchi di I/O del log dall'area di marshalling alla risorsa di archiviazione stabile, ad esempio un disco. Nel dispositivo di archiviazione stabile il log è costituito da un set di contenitori, ognuno dei quali è un extent contiguo sul supporto fisico. Una raccolta di contenitori che costituisce l'archiviazione stabile per un flusso è detta log o log fisico.

La figura seguente illustra un contenitore.

diagram illustrating containers, blocks, and records.

La figura precedente illustra un contenitore che contiene tre blocchi di I/O del log. Il primo blocco di I/O del log contiene tre record, il secondo contiene cinque record e il terzo contiene due record. Come suggerisce la figura, l'inizio di ogni blocco di I/O del log è sempre allineato all'inizio di un settore nel supporto di archiviazione stabile. Si noti che i blocchi di I/O del log nell'archiviazione stabile variano in base alle dimensioni.

CLFS usa un set di tre numeri per individuare un record in un log.

  • L'identificatore del contenitore identifica il contenitore che contiene il record.

  • L'offset del blocco restituisce l'offset dei byte, all'interno del contenitore, all'inizio del blocco di I/O del log che contiene il record.

  • Il numero di sequenza del record identifica il record all'interno del blocco di I/O del log.

Il numero di sequenza di log (LSN) di un record di log CLFS contiene effettivamente queste tre informazioni: identificatore del contenitore, offset del blocco e numero di sequenza di record. Tuttavia, i nomi LSN assegnati ai client di log contengono identificatori di contenitore logici di cui CLFS deve eseguire il mapping agli identificatori di contenitore fisici prima di accedere ai record nell'archiviazione stabile.

CLFS usa identificatori di contenitore logici per dare ai client la visualizzazione che i record di log vengono scritti in una sequenza continuativa di contenitori, quando in realtà i contenitori fisici vengono riciclati.

Si supponga che un log abbia tre contenitori e che un singolo client stia scrivendo record CLFS nel log. Lo scenario seguente illustra come riciclare un contenitore.

  1. Il client scrive record di log sufficienti per riempire tutti e tre i contenitori.

  2. Il client imposta la base di log (chiamando ClfsAdvanceLogBase o ClfsWriteRestartArea). In questo modo, il client dice che non richiede più i record nel contenitore 1.

  3. Il client scrive un altro record nel log e recupera l'LSN del record appena scritto. L'identificatore del contenitore logico in tale LSN è 4. Quando i record vengono scaricati in una risorsa di archiviazione stabile, i record visualizzati dal client nel contenitore logico 4 verranno inviati al contenitore fisico 1.

La figura seguente illustra lo scenario; mostra come viene eseguito il mapping della sequenza client di contenitori logici ai contenitori fisici in una risorsa di archiviazione stabile.

diagram illustrating logical and physical containers.

L'identificatore del contenitore logico, l'offset del blocco e il numero di sequenza di record vengono archiviati in un LSN in modo che i LSN per un determinato flusso formino sempre una sequenza rigorosamente crescente. Vale a dire, l'LSN (con identificatore di contenitore logico) di un record di log scritto in un flusso è sempre maggiore dei nomi LSN dei record di log scritti in precedenza nello stesso flusso. Gli LSN, quindi, servono un doppio scopo: 1) forniscono ai client di un flusso una sequenza ordinata di identificatori di record e 2) forniscono a CLFS la posizione dei record nell'archiviazione stabile.

Dato l'LSN di un record, è possibile estrarre l'identificatore del contenitore logico, l'offset del blocco e il numero di sequenza di record chiamando le funzioni seguenti.

ClfsLsnContainer

ClfsLsnBlockOffset

ClfsLsnRecordSequence

L'identificatore del contenitore logico è un numero a 32 bit, quindi sono presenti 2^32 possibili identificatori di contenitore logico e sono inclusi nell'intervallo 0x0 attraverso 0xFFFFFFFF. Un flusso può avere al massimo 2^32 contenitori logici.

L'offset del blocco viene archiviato in 23 bit dell'LSN, ma ClfsLsnBlockOffset restituisce un numero a 32 bit allineato alle dimensioni del settore del supporto di archiviazione stabile. L'offset del blocco è sempre un multiplo di 512. Inoltre, l'offset del blocco è allineato alle dimensioni del settore del supporto di archiviazione stabile. Ad esempio, se la dimensione del settore è pari a 1024 byte, l'offset del blocco sarà un multiplo di 1024.

Il numero di sequenza del record è un numero a 9 bit, quindi esistono 2^9 (512) possibili numeri di sequenza di record e sono compresi nell'intervallo 0x0 attraverso 0x1FF. Un blocco di I/O del log può contenere al massimo 512 record.