Sto progettando un'applicazione che aggiungerà blob a un file su disco (file system locale) e attualmente sto pensando a come gestire i problemi di coerenza che potrebbero verificarsi se:
- L'applicazione si blocca improvvisamente
- L'intero sistema si arresta, ad es. a causa di un'interruzione di corrente
L'obiettivo è che, quando il file viene letto più tardi, l'applicazione che processa i BLOB dovrebbe essere in grado di distinguere se un blob è stato danneggiato (e quindi evitare di elaborarlo).
La mia idea attuale è quella di scrivere quanto segue su disco per ogni blob e flush dopo ogni:
[Size of blob]
(4 byte) [CRC-32 hash of blob]
(4 byte, altro per rilevare i problemi mentre i file invecchiano nel tempo) [actual blob bytes]
Ecco le domande:
- Questo garantisce che, nel caso si verificasse una qualsiasi delle condizioni sopra descritte, il file conterrà solo dati validi, o
n
blob validi + alcuni byte extra dove interpretare i primi quattro come dimensione indicherà facilmente che non ci sono abbastanza rimanenti byte nel file per un blob appropriato (oppure i byte extra sono sotto i 4, non abbastanza per contenere le dimensioni corrette)? - Potrebbero essere presenti byte corrotti che sono stati precedentemente scritti sul disco all'interno del file?
- Potrebbe una perdita di potenza corrompere il file in modo tale da apparire più grande di quanto dovrebbe (e quindi contenere vari rifiuti alla fine)?
- I vari filesystem possono portare a comportamenti strani a questo riguardo? L'applicazione sarà multipiattaforma e sto cercando di evitare di scrivere codice specifico per piattaforma per questo.
Alcune altre considerazioni:
- I blob saranno relativamente piccoli (intorno a qualche kB, < 100 kB)
- La perdita di un numero di blob in caso di arresto improvviso è accettabile
- Quando l'applicazione viene riavviata, creerà un nuovo file vuoto, non accodato a uno già esistente
- Solo un thread di un processo eseguirà l'aggiunta
- Non è consentito leggere il file prima che sia chiuso
- Se si verifica un'interruzione dell'alimentazione, dopo il riavvio verrà eseguito un controllo di coerenza sul file system.