Contesto: sto sviluppando un software che riproduce le funzionalità di Windows Home Server Drive Extender , dove gli utenti usano più dischi rigidi per prevenire la perdita di dati.
Il software esiste dal Dic-2009, ma ha problemi con la rinomina (dettagliata sotto).
Ho una directory, dirA, in cui gli utenti possono lavorare: possono creare, modificare, rinominare ed eliminare file e amp; sottodirectory in dirA.
Voglio mantenere un'altra directory, dirB, in sincronia con dirA.
L'obiettivo è avere un backup di tutti i file in dirA, nel caso in cui l'unità su cui si trova non funzioni (dirB si troverebbe su un'altra unità).
Quello che mi piacerebbe è una discussione sulla ricerca di un algoritmo funzionante che realizzerebbe quanto sopra, con le limitazioni elencate di seguito.
Requisiti:
1. Qualcosa di asincrono: non voglio interrompere le operazioni sui file in dirA mentre lavoro in dirB.
2. Non posso supporre che posso riaccedere ciecamente dirA a dirB su intervalli regolari - dirA potrebbe contenere milioni di file e amp; directory e terrabytes di dati. Camminare completamente sulla dirA potrebbe richiedere ore.
Questi due requisiti rendono questo davvero difficile.
Avere asincrono significa che quando inizio a lavorare su un file specifico da dirA, potrebbe essersi spostato molto da quando è apparso.
E la seconda limitazione significa che ho davvero bisogno di guardare dirA e di lavorare sulle operazioni di file atomico che noto.
Implementazione corrente (interrotta):
1. Registra tutti i file e amp; operazioni di directory in dirA.
2. Utilizzando un processo separato, leggere quel registro e "ripetere" tutte le operazioni registrate in dirB.
Perché è rotto:
echo 1 > dirA/file1
# Allow the 'log reader' process to create dirB/file1:
log = "write dirA/file1"; action = cp dirA/file1 dirB/file1; result = OK
echo 1 > dirA/file2
mv dirA/file1 dirA/file3
mv dirA/file2 dirA/file1
rm dirA/file3
# End result: file1 contains '1'
# 'log reader' process starts working on the 4 above file operations:
log = "write file2"; action = cp dirA/file2 dirB/file2; result = failed: there is no dirA/file2
log = "rename file1 file3"; action = mv dirB/file1 dirB/file3; result = OK
log = "rename file2 file1"; action = mv dirB/file2 dirB/file1; result = failed: there is no dirB/file2
log = "delete file3"; action = rm dirB/file3; result = OK
# End result in dirB: no more files!
Un altro esempio rotto:
echo 1 > dirA/dir1/file1
mv dirA/dir1 dirA/dir2
# 'log reader' process starts working on the 2 above file operations:
log = "write file1"; action = cp dirA/dir1/file1 dirB/dir1/file1; result = failed: there is no dirA/dir1/file1
log = "rename dir1 dir2"; action = mv dirB/dir1 dirB/dir2; result = failed: there is no dirA/dir1
# End result if dirB: nothing!