Come posso mantenere sincronizzate le directory

0

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!
    
posta Guillaume Boudreau 15.01.2011 - 13:44
fonte

3 risposte

1

Per risolvere i problemi sopra elencati (e innumerevoli altri), ho creato un algoritmo che controlla il nome 'futuro' di un file. Quindi, se voglio lavorare su file1, e non esiste più, allora cerco nelle operazioni successive di trovare dove si trova ora e lo uso come origine per creare la copia del file1 in dirB. Usando questo, ho risolto tutti i casi di test che avevo fallito in precedenza.

    
risposta data 18.01.2011 - 16:12
fonte
4

L'approccio corretto è

a) sincronizzare inizialmente i contenuti di dirA e dirB, b) catturare tutti gli eventi dei file su dirA e riprodurli su dirB.

Questo è fatto facilmente a livello di programmazione utilizzando il driver del filtro del file system che catturerà tutte le operazioni su dirA e le passerà al sistema dirB per la riproduzione.

È importante, tuttavia, che il journal completo sia scritto su dirA se non c'è connessione al sistema dirB, E che gli tutti eventi per dirA vengono catturati. Perdere qualsiasi informazione sulle modifiche dirA richiederebbe una completa risincronizzazione di dirB con dirA.

    
risposta data 15.01.2011 - 14:14
fonte
2

rsync esiste su Windows [1] , [2] ; Provalo. Sa come sincronizzare le directory, direttamente o tramite rete.

    
risposta data 15.01.2011 - 18:30
fonte

Leggi altre domande sui tag