C'è un POSIX-modo per garantire due file sono lavata in sequenza senza bloccare?
-
03-10-2019 - |
Domanda
Nel mio programma, tengo due file aprire per la scrittura, un contenuto di file, che contiene blocchi di dati, e di un file di indice, che contiene una mappa su cui blocchi di dati sono stati scritti finora.
vorrei entrambi irrigare a disco, come performante possibile, con l'unico vincolo che i blocchi nel file di dati devono essere scritti prima dei corrispondenti blocchi nella mappa file (naturalmente).
Il problema è che vorrei evitare il blocco OSSIA facendo un fsync, sia per la latenza e throughput motivi.
Tutte le idee?
Soluzione
Non credo che si può fare facilmente in un unico percorso di esecuzione. È necessario Fsync avere la scrittura su disco garantito - e questo sta andando ad avere per attendere che la scrittura.
ho il sospetto che è possibile (ma non facile) per fare questo, delegando il compito di scrittura ad una discussione o un processo separato. Generare i dati nel programma esistente e 'write' al secondo thread / processo utilizzando qualsiasi metodo che sembra ragionevole. Questo può essere non bloccante. Il secondo filo sarebbe quindi scrivere i nuovi dati ai dati al contenuto del file, quindi fsync, quindi scrivere l'index-file, quindi controllare per i nuovi dati di nuovo. decisioni di progettazione chiave si riferiscono a come separare i due percorsi di esecuzione, come si comunica tra di loro, e se avete bisogno di riferire sul retro scrittura al programma principale. Ciò potrebbe avere ancora la latenza e la velocità problemi, ma che parte del costo della scelta di avere l'indice di file e contenuti file in sincronia di. Almeno ci sarebbe una possibilità di ottenere il lavoro fatto durante l'attesa sul disco.
Potrebbe valere la pena guardare per vedere se questo è ben incapsulato in modo da essere utile a voi nella sorgente di uno dei database transazionali. Si potrebbe anche studiare l'opzione di sincronizzazione quando si monta il file system per il contenuto-file.