Blokada plików o skręcie
Podobnie jak inne odpowiedzi wspomniałem, najprostszym sposobem jest utworzenie pliku blokady w tym samym katalogu, co pliku danych.
Ponieważ chcesz mieć dostęp do tego samego pliku na wielu komputerach, najlepszym rozwiązaniem, jakie mogę sobie wyobrazić, jest dołączenie identyfikatora komputera zapisującego do pliku danych.
Zatem sekwencja do pisania do pliku danych będzie:
Sprawdź, czy istnieje plik blokady obecny
Jeśli istnieje plik blokady, zobacz, czy jestem jedynym posiadanie go poprzez sprawdzenie, czy jego zawartość ma mój identyfikator.
Jeśli tak jest, po prostu zapisz w pliku danych, a następnie usuń plik blokady.
Jeśli tak nie jest, po prostu odczekaj sekundę lub małą losową długość czasu i spróbuj ponownie całego cyklu.
Jeśli nie ma pliku blokady, utwórz go z moim identyfikatorem i spróbuj ponownie cały cykl, aby uniknąć sytuacji wyścigowej (ponownie sprawdź, czy plik blokady jest naprawdę mój).
Wraz z identyfikatorem, chciałbym nagrać znacznik czasu w pliku blokady i sprawdzić, czy jest starszy niż podana wartość limitu czasu.
Jeśli znacznik czasu jest zbyt stary, należy założyć, że plik blokady jest nieaktualny i po prostu go usunąć, ponieważ spowodowałoby to awarię jednego z zapisanych na komputerze plików do pliku danych lub utratę połączenia.
Innym rozwiązaniem
Jeśli jesteś w kontroli formatu pliku danych, może być zarezerwować strukturę na początku pliku do zapisu czy jest zablokowane lub nie.
Jeśli tylko zarezerwujesz bajt do tego celu, możesz założyć, na przykład, że plik 00
oznaczałby, że plik danych nie jest zablokowany, a inne wartości będą reprezentować identyfikator aktualnie zapisywanego komputera.
Problemy z NFS
OK, jestem dodając kilka rzeczy, ponieważ Jiri Klouda prawidłowo wskazał, że NFS uses client-side caching że spowoduje rzeczywistego pliku zamka będącego w stanie nieustalonym.
Kilka sposobów, aby rozwiązać ten problem:
zamontować katalog NFS z noac
lub sync
opcji. Jest to łatwe, ale nie gwarantuje pełnej spójności danych między klientem a serwerem, więc nadal mogą występować problemy, chociaż w twoim przypadku może być OK.
Otwórz plik blokady lub plik danych, używając atrybutów O_DIRECT
, O_SYNC
lub O_DSYNC
. To ma na celu całkowite wyłączenie buforowania.
Spowoduje to obniżenie wydajności, ale zapewni spójność.
Ty może móc korzystać flock()
zablokować plik danych, ale jego realizacja jest rzadki i trzeba będzie sprawdzić, czy dany system operacyjny faktycznie korzysta z usługi blokowania NFS. W przeciwnym razie może nic nie robić.
Jeśli plik danych jest zablokowany, to inny klient otwierający go do zapisu nie powiedzie się.
O tak, i wydaje się, że nie działa na udziałach SMB, więc najlepiej jest po prostu o tym zapomnieć.
Nie używaj NFS i po prostu użyj Samby zamiast: istnieje good article on the subject i dlaczego NFS prawdopodobnie nie jest najlepszą odpowiedzią na twój scenariusz użycia.
W tym artykule znajdziesz również różne metody blokowania plików.
Rozwiązanie Jiri jest również dobre.
Zasadniczo, jeśli chcesz zachować prostotę, nie używaj NFS do często aktualizowanych plików, które są współużytkowane przez wiele komputerów.
Coś innego
Użyj małego serwera bazy danych do zapisania danych do i ominąć problemy blokujące NFS/SMB całkowicie lub utrzymać aktualny wielobiegunowy układ plików danych i po prostu napisać mały narzędzie do łączenia wyników.
To wciąż może być najbezpieczniejsze i najprostsze rozwiązanie twojego problemu.
Musisz przegapić część, w której powiedział, że potrzebuje synchronizacji między różnymi komputerami. –
To rozwiązanie nie działa w systemie plików NFS, ponieważ zażądał. –
Dlaczego nie wykonalibyśmy tej pracy? Nie chodzi mi o pisanie pliku lokalnie na każdym komputerze, ale w jednym miejscu dla nich wszystkich. – Seb