Chcę automatycznie przetestować, czy oprogramowanie reaguje zgodnie z oczekiwaniami, jeśli niezbędny plik SQLite DB nie zostanie odczytany (powodując błąd we / wy). Dokładnie tak się stało kilka dni temu u klienta. Naprawiliśmy go ręcznie, ale teraz chcę utworzyć automatyczny kod, aby go naprawić i potrzebuję dostępu do uszkodzonego pliku, aby go przetestować.
Ponieważ wszystko w Uniksie jest plikiem, podejrzewałem, że może istnieć specjalny plik, który zawsze powoduje błędy We / Wy, gdy ktoś próbuje go odczytać (np. W / dev).
Niektóre podobne pliki (imo) to:
/dev/full
która zawsze mówi „Brak miejsca na urządzeniu”, jeśli spróbujesz to napisać/dev/null
i/dev/zero
więc założyłem, że musi to być taki plik (ale jeszcze go nie znalazłem).
Czy ktoś zna taki plik lub inną metodę uzyskania pożądanego rezultatu (celowo wadliwy obraz partycji, opakowanie wokół open () przy użyciu LD_PRELOAD, ...)?
Jaka jest najlepsza droga tutaj?
Odpowiedzi:
Można użyć
dmsetup
do utworzenia urządzenia do mapowania urządzeń przy użyciu celuerror
lubflakey
do symulowania awarii.Gdzie 123 to długość urządzenia, w sektorach, a / dev / loop0 to oryginalne urządzenie, na którym chcesz symulować błędy. W przypadku błędu nie potrzebujesz kolejnych argumentów, ponieważ zawsze zwraca błąd.
źródło
dmsetup table test
. Możesz nawet pisaćfoo bar
zaerror
; to po prostu nie obchodzi (i dlatego powinno zostać usunięte).Istnieje już duży zestaw odpowiedzi na temat przepełnienia stosu i błędu serwera, ale brakowało niektórych technik. Aby ułatwić życie, oto lista mechanizmów blokowania VM / Linux / systemu plików Linux / biblioteki przestrzeni użytkownika Linux biblioteki mechanizmów wstrzykiwania błędów we / wy:
--layout
opcję strony podręcznika mdadm, aby dowiedzieć się, jak ją skonfigurować (bity jądra i mdadm użytkownika).LD_PRELOAD
).FAIL_MAKE_REQUEST=y
).BLK_DEV_NULL_BLK_FAULT_INJECTION=y
).delay
lub,error
a następnie podłącz do niego urządzenie blokowe za pomocąnbd-client
(jądro + bity przestrzeni użytkownika NBD, jądro> = 4,18 zbudowane z obsługą NBD, nbdclient> = 3.18 i nbdkit> = 1.8.1 zalecane - patrz film demonstracyjny NBDKit około 20 minut).Dodatkowy fakt: SQLite ma sterownik VFS do symulacji błędów, dzięki czemu może uzyskać dobry zasięg testu.
Związane z:
źródło
Potrzebujesz mechanizmu iniekcji błędów dla I / O.
W systemie Linux jest to metoda, która nie wymaga wcześniejszej konfiguracji i generuje nietypowy błąd (nie EIO „Błąd wejścia / wyjścia”, ale ESRCH „Brak takiego procesu”):
gdzie 1234 jest PID procesu uruchomionego jako ten sam użytkownik co testowany proces, ale nie sam proces. Kredyty na rubasov do myślenia o
/proc/$pid/mem
.Jeśli użyjesz PID samego procesu, otrzymasz EIO, ale tylko jeśli czytasz z obszaru, który nie jest zmapowany w pamięci procesu. Pierwsza strona nigdy nie jest mapowana, więc jest ok, jeśli czytasz plik sekwencyjnie, ale nie nadaje się do procesu bazy danych, który szuka bezpośrednio do środka pliku.
Mając trochę więcej ustawień jako root, możesz wykorzystać mapowanie urządzeń do tworzenia plików z prawidłowymi i uszkodzonymi sektorami.
Innym podejściem byłoby wdrożenie małego systemu plików FUSE . EIO jest domyślnym kodem błędu, gdy sterownik systemu plików przestrzeni użytkownika robi coś złego, więc łatwo go osiągnąć. Zarówno wiązania Perla, jak i Pythona zawierają przykłady na początek. Możesz szybko napisać system plików, który głównie odzwierciedla istniejące pliki, ale wstrzykuje EIO w starannie wybrane miejsca. Istnieje taki system plików: petardfs ( artykuł ), nie wiem, jak dobrze działa po wyjęciu z pudełka.
Jeszcze inną metodą jest
LD_PRELOAD
opakowanie. Istniejącym jest Libfiu (wstrzykiwanie błędów w przestrzeni użytkownika). Działa poprzez wstępne załadowanie biblioteki, która przeciąża wywołania API POSIX. Możesz napisać proste dyrektywy lub dowolny kod C, aby zastąpić normalne zachowanie.źródło
Rozwiązanie jest o wiele łatwiejsze, jeśli można użyć pliku urządzenia jako „pliku z błędami we / wy”. Moja propozycja dotyczy przypadków, w których zwykły plik zawiera takie błędy.
Muszę przyznać, że jestem trochę zdezorientowany, ponieważ nie udało mi się odczytać pojedynczych sektorów z tego pliku bez błędu (z
dd .. seek=...
). Być może jest to problem z wyprzedzeniem.źródło
Możesz użyć CharybdeFS, który został stworzony właśnie do tego celu.
Jest to system plików bezpieczników przejściowych, takich jak PetardFS, ale o wiele bardziej konfigurowalny.
Zobacz książkę kucharską CharybdeFS tutaj: http://www.scylladb.com/2016/05/02/fault-injection-filesystem-cookbook/
Jest wystarczająco zaawansowany, aby przetestować bazę danych.
źródło