I/O 오류를 일으키는 특수 파일

I/O 오류를 일으키는 특수 파일

중요한 SQLite DB 파일을 읽을 수 없는 경우(I/O 오류 발생) 소프트웨어가 예상대로 반응하는지 자동으로 테스트하고 싶습니다. 이것이 바로 며칠 전 한 고객에게서 일어난 일입니다. 수동으로 문제를 해결했지만 이제 문제를 해결하기 위한 자동 코드를 만들고 테스트하려면 손상된 파일에 액세스해야 합니다.

Unix의 모든 것은 파일이기 때문에 사람들이 읽으려고 할 때 항상 I/O 오류를 일으키는 특수 파일(예: /dev)이 있을 수 있다고 생각합니다.

일부 유사한 파일(imo)은 다음과 같습니다.

  • /dev/full쓰려고 하면 항상 "장치에 남은 공간이 없습니다"라는 메시지가 나타납니다.
  • /dev/null그리고/dev/zero

그래서 제 생각에는 이와 같은 파일이 있으면 될 것 같습니다(아직 찾지 못했습니다).

원하는 결과를 얻을 수 있는 파일이나 다른 방법을 아는 사람이 있습니까(open() 주위에 LD_PRELOAD 래퍼를 사용하여 의도적으로 잘못된 파티션 이미지...)?
여기로 가는 가장 좋은 방법은 무엇인가요?

답변1

스택 오버플로 및 서버 오류에 대한 이 질문에 대한 답변은 이미 많이 있지만 일부 기술이 누락되어 있습니다. 삶을 더 쉽게 만들기 위해 VM/Linux 블록 장치/Linux 파일 시스템/Linux 사용자 공간 라이브러리 I/O 오류 주입 메커니즘 목록은 다음과 같습니다.

추가 사실:SQLite에는 오류 시뮬레이션을 위한 VFS 드라이버가 있습니다.이는 좋은 테스트 적용 범위로 이어집니다.

관련된:

답변2

또는 대상을 사용하여 dmsetup장치 매퍼 장치를 생성하여 오류를 시뮬레이션할 수 있습니다.errorflakey

dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'

여기서 123은 섹터 단위의 장치 길이이고 /dev/loop0은 오류가 시뮬레이션될 원시 장치입니다. 오류의 경우 항상 오류를 반환하므로 후속 매개변수가 필요하지 않습니다.

답변3

당신은 하나를 원한다결함 주입I/O 메커니즘.

Linux에서는 사전 설정이 필요하지 않고 예외 오류(EIO "입력/출력 오류"가 아니라 ESRCH "해당 프로세스 없음")를 생성하는 방법이 있습니다.

cat /proc/1234/mem

여기서 1234는 테스트 중인 프로세스와 동일한 사용자로 실행되는 프로세스의 PID이지만 프로세스 자체는 아닙니다. 감사의 말루바소프~을 위한생각~의/proc/$pid/mem.

프로세스 자체의 PID를 사용하면 EIO를 얻게 되지만 프로세스의 메모리에 매핑되지 않은 영역에서 읽는 경우에만 해당됩니다. 첫 번째 페이지는 매핑되지 않으므로 파일을 순차적으로 읽는다면 괜찮지만 파일 중간을 직접 보는 데이터베이스 프로세스에는 적합하지 않습니다.

루트로서 더 많은 설정을 하려면 다음을 수행하십시오.장치 매퍼 활용유효한 섹터와 불량 섹터가 있는 파일을 만듭니다.

또 다른 접근 방식은 작은 규모를 구현하는 것입니다.퓨즈파일 시스템. EIO는 사용자 공간 파일 시스템 드라이버에서 오류가 발생할 때 기본 오류 코드이므로 구현이 쉽습니다. 이 두진주그리고파이썬바인딩에는 기존 파일을 대부분 미러링하지만 신중하게 선택한 위치에 EIO를 주입하는 파일 시스템을 빠르게 작성할 수 있는 시작 예제가 함께 제공됩니다. 다음과 같은 기존 파일 시스템이 있습니다.petarddevs(기사), 그것이 기본적으로 얼마나 잘 작동하는지 모르겠습니다.

또 다른 방법은LD_PRELOAD포장지. 기존 것은도서관(사용자 공간에 오류 주입). POSIX API 호출을 오버로드하는 라이브러리를 미리 로드하여 작동합니다. 간단한 지침이나 임의의 C 코드를 작성하여 정상적인 동작을 재정의할 수 있습니다.

답변4

이 목적을 위해 특별히 제작된 CharybdeFS를 사용할 수 있습니다.

PetardFS와 유사하지만 더 구성 가능한 통과 퓨즈 파일 시스템입니다.

여기에서 CharybdeFS 레시피를 참조하세요.http://www.scyladb.com/2016/05/02/fault-injection-filesystem-cookbook/

데이터베이스를 테스트할 수 있을 만큼 충분히 발전했습니다.

관련 정보