Mam środowisko wbudowane Linuksa.

Tutaj mam 2 scenariusze:

A:

  1. Otwórz i napisz plik tymczasowy.
  2. Zmień nazwę pliku tymczasowego do oryginalnego pliku.
  3. Utrata mocy

Wynik: po ponownym uruchomieniu, to, co mam, to:

  • 0-rozmiar oryginalny plik i nie ma pliku tymczasowego.

b:

  1. Otwórz i napisz plik tymczasowy.

  2. fsync plik tymczasowy.

  3. Zmień nazwę pliku tymczasowego do oryginalnego pliku.

  4. Utrata mocy

Wynik: po ponownym uruchomieniu,

  • Oryginalna zawartość oryginalnego pliku jest przechowywana, choć nie aktualizowana
  • 0-rozmiar pliku tymczasowego

Jak widzisz, między tymi 2 scenariuszami jedyną różnicą jest FSYNC pliku tymczasowego , a nie oryginalny plik. W obu, i nie był fsync oryginalnego pliku .

Tak więc Dlaczego Oryginalna zawartość oryginalnego pliku jest utrzymywana w scenariuszu B?

Z punktu widzenia oryginalnego pliku, zmiana jest aktualizowanie go przez zmiana nazwy nie-fsynced Plik vs fsynced pliku .

jak oznacza to oryginalną treść?

Edytować:

Ten scenariusz aktualizujący oryginalny plik nie udało się również bezpiecznie wykorzystać oryginalnego pliku:

  1. Otwórz i napisz plik tymczasowy.

  2. FSYNC tymczasowy plik.

  3. Zmień nazwę pliku tymczasowego do oryginalnego pliku.

  4. Katalog FSYNC oryginalny plik

  5. Utrata mocy

Wynik:

0-rozmiar oryginalny plik.

Więc jak mam to zrobić?

2
Mert Mertce 20 lipiec 2020, 10:36

1 odpowiedź

Najlepsza odpowiedź

Normalnie, jeśli chcesz być odporny na utratę mocy, używasz protokołów. Oznacza to, że (szeroko mówiony) przechowujesz to, co chcesz pisać, a gdzie go piszesz, a gdy tak z powodzeniem zostanie napisany, usuwasz go (przynajmniej logicznie) z czasopisma. W przypadku poważnej awarii (strata mocy lub inna awaria systemu), czytasz czasopismo i stosujesz wszelkie zmiany wciąż. Wiele systemów plików ma opcje, aby go włączyć, aw systemie plików online, można oczekiwać, że nazwa ma być atomowa i odporność na utratę mocy: plik będzie istnieć pod jego poprzedniej lub nową nazwą.

Więc wspólny przepływ pracy to:

  • Zmień nazwę starego pliku do nazwy kopii zapasowej
  • Napisz nowy plik na jego ostateczną nazwę
  • Zamknij newfile, aby upewnić się, że będzie przebyć na dysku
  • Usuń plik kopii zapasowej (lub daj mu inną nazwę)

W przypadku utraty mocy (lub dowolnego innego stanu awaryjnego), na następnym ponownym uruchomieniu rzeczy są proste:

  • Jeśli nie ma pliku kopii zapasowej, plik jest w stanie stabilnym
  • Jeśli pojawia się plik kopii zapasowej, zawiera ostatni stabilny stan pliku: Plik musi zostać usunięty, jeśli istnieje, a kopia zapasowa musi zostać zmieniona na normalną nazwę
1
Serge Ballesta 20 lipiec 2020, 08:33