2015-06-06 26 views
8

Utilizzando C, in esecuzione su Linux, sto cercando di capire come avere 2 processi diversi accedere allo stesso file situato su un filesystem NFSv4. Nello specifico, voglio avere un programma per fopen un file per la lettura, e avere un secondo programma per fopen il file per la scrittura. Intendo utilizzare il nuovo EFS (Elastic File System) di AWS ed EFS è solo NFSv4.Accesso simultaneo ai file in nfsv4 linux c

La natura dei programmi è tale che lo scrittore, in sostanza, accederà al file. Il lettore non accederà mai alle informazioni appena aggiunte fino a quando lo scrittore non ha finito e ha chiamato fflush.

NFSv4 supporta questo scenario?

Oppure esiste un modo migliore per ottenere tale accesso al file NFSv4 concomitante?

+0

* NFSv4 supporta questo scenario? * Non ne ho idea. Perché non usare la memoria condivisa con [ipcs] (http://en.wikipedia.org/wiki/Ipcs)? –

+0

@ElliottFrisch: Potrei usare la memoria condivisa con ipcs, ma c'è un'enorme quantità di dati (> 500 terabyte) in un numero enorme di file (> 40 milioni). E in crescita. – PaeneInsula

+0

Sembra che dovresti guardare [HDFS] (https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Overview). –

risposta

2

NFS v4 supporta byte bloccaggio range sul file (come descritto in questo estratto da RFC 3530 "NFS version 4 protocol"):

1.4.5. Blocco dei file

Con il protocollo NFS versione 4, il supporto per il blocco dei file dell'intervallo di byte fa parte del protocollo NFS. Il supporto per il blocco dei file è strutturato in modo che non sia richiesto un meccanismo di callback RPC. Questo è un allontanamento dalle precedenti versioni del protocollo di blocco dei file NFS, Network Lock Manager (NLM). Lo stato associato ai blocchi dei file viene mantenuto sul server in base a un modello basato sul lease. Il server definisce un singolo periodo di leasing per tutto lo stato detenuto da un client NFS. Se il cliente non rinnova il leasing entro il periodo definito, tutti gli stati associati al contratto di locazione del cliente possono essere rilasciati dal server. Il cliente può rinnovare il leasing con l'uso dell'operazione RENEW o implicitamente mediante l'uso di altre operazioni (principalmente READ).

Fare riferimento alla sezione 8 della stessa RFC per maggiori dettagli sul blocco e sul modello basato su lease.

Per la gestione del blocco è necessario utilizzare fcntl. Il mio consiglio è di scrivere un test per verificare che l'effettiva implementazione di NFS v4 fornita da EFS supporti il ​​blocco come previsto (alcuni aspetti sono opzionali nelle specifiche). È possibile fare riferimento al codice sorgente di this lock testing suite, che supporta il test multi-cliente.