2013-08-08 10 views
10

La documentazione di DirectoryStream afferma chiaramente:Iterazione un DirectoryStream e cambiare il contenuto di una directory, allo stesso tempo

L'iteratore è debolmente coerente. È thread-safe ma non blocca la directory durante l'iterazione, quindi può (o non può) riflettere gli aggiornamenti nella directory che si verificano dopo che DirectoryStream è creato.

Sulla mia macchina, ho eseguito una semplice iterazione su una directory in modalità di debug. Prima che l'iterazione fosse completata, ho interrotto l'esecuzione, aggiunto un file alla directory che è stata ripetuta e ripresa. L'iterazione non ha visto il file supplementare.

La mia domanda: in quale circostanza sarà l'iterazione riflette gli aggiornamenti ai contenuti della directory? Sfortunatamente la documentazione formale è molto vaga a riguardo. Per non dire altro.

+2

Non so, ma il modo in cui l'ho letto non è deterministico e può dipendere dal SO/FS sottostante o dalle implementazioni specifiche. La mia ipotesi migliore è che rifletterà gli aggiornamenti se la tua directory si trova su un inode che si trova più avanti nella struttura dell'albero rispetto a quello corrente che l'iteratore sta puntando. Come provocare questo comportamento non lo so. Sono fiducioso nel dire che non è immediatamente possibile (in modo deterministico) l'utilizzo di Java puro. –

risposta

4

La documentazione è intenzionalmente vaga. La JVM deve essere eseguita su diversi tipi di macchine: Windows e Unix-derivati. Diversi file system hanno comportamenti diversi. È necessario (ripeto, DEVE) progettare il caso peggiore se si desidera che il programma funzioni in modo affidabile su più di un computer.

La legge di sorpresa minima suggerisce che è necessario sommergere l'intero DirectoryStream per ottenere uno snapshot (o molto vicino a uno), scorrere sullo snapshot e quindi ri-slurp del flusso. È quindi possibile confrontare le diverse versioni degli snapshot per determinare le modifiche alla directory sottostante.

+0

Sono completamente d'accordo con la conclusione, la domanda era per interesse accademico. – Vitaliy

2

Come DirectoryStream è un'interfaccia e poiché questa parte di NIO.2 è pensata per essere collegabile, non limitare la considerazione alle implementazioni fornite con JDK per Linux e Windows. Sarebbe del tutto possibile scrivere un'implementazione personalizzata esattamente con quel comportamento, o per un'implementazione in cluster o distribuita per avere quel comportamento come un effetto collaterale.

La documentazione è volutamente vaga, e sotto POSIX delegando a readdir che è also intentionally vague:

Se un file viene rimosso o aggiunto alla directory dopo l'ultima chiamata a opendir() o rewinddir (), se una successiva chiamata a readdir_r() restituisce una voce per quel file non è specificata.

Tuttavia, se siete dopo un caso concreto in cui un'implementazione basata su tale vaghezza, poi Linux ext3 readdir and concurrent updates mostra un caso in cui rsync, su un ext3 file system con alto volume, apparso per vedere file vengono visualizzati nella directory di fuori l'ordine in cui sono stati creati.

Problemi correlati