重要な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 エラー注入メカニズムのリストは次のとおりです。
- 使用デバイスマッパーエラー/シート/遅延/DMダスト 合成ブロックデバイスから合成ブロックデバイス(カーネル、デバイスマッパーサポートで構築されたカーネルが必要、適切な追加のデバイスマッパーモジュール(dm-dustはカーネル> = 5.2でのみ使用可能)としてエラー/損傷または遅延/分割IOを返すデバイス)デバイスマッパーユーザースペースビット)。
- 使用MDの性格が変です。合成ブロック装置に定期的に誤差注入を行う。より
--layout
mdadm のマニュアルページオプション設定方法(カーネルとmdadmユーザースペースビット)を学びます。 - 使用libfiu は POSIX API 呼び出しにエラー注入を実行します。 (ユーザースペースはと共に使用できます
LD_PRELOAD
)。 - 使用Linuxカーネルのエラーインジェクタは、基本ブロックデバイスにエラーを注入します。 (カーネルはカーネルがでビルドされなければなりません
FAIL_MAKE_REQUEST=y
)。 - 使用SystemTap はエラー注入を実行します。(カーネル、カーネルビルドが必要多くのこと)。
- CharybdeFSを使用したファイルシステムエラーの注入またはペタドFS(FUSEによるユーザースペース)。
- 次のコマンドを使用して合成ブロックデバイスを作成します。エラー注入を実行するLinux scsi_debugドライバ(核心)。
- QEMUでシステムを実行して使用します。QEMUはblkdebugドライバを使用してブロックデバイスエラーを挿入します。(仮想機器)。
- 次のようにして合成ブロックデバイスを作成します。欠陥を注入するデバイスのnull_blkオプション(カーネル> = 4.14ですが、次のオプションはタイムアウト確率4.17までは表示されず、カーネルをビルドする必要があります
BLK_DEV_NULL_BLK_FAULT_INJECTION=y
。 - を介してホストにサービスを提供する包括的なネットワークブロックデバイスを作成します。NBDkitフィルタ例えば
delay
またはerror
nbd-client
次に、カーネル+ NBDユーザースペースビット、カーネル> = 4.18に組み込まれたNBDサポート、nbdclient> = 3.18、およびnbdkit> = 1.8.1を推奨し、ブロックデバイスを接続します。 - 参照NBDKitデモビデオ約20分)。
追加の事実:SQLiteには、エラーシミュレーション用のVFSドライバがあります。これは良いテストの適用範囲につながります。
関連:
答え2
または、ターゲットを使用してdmsetup
デバイスマッパーデバイスを作成してエラーをシミュレートすることもできます。error
flakey
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 は、ユーザー空間ファイルシステムドライバでエラーが発生した場合のデフォルトのエラーコードなので、実装が簡単です。これら二つ真珠そしてPythonバインディングには、既存のファイルをほとんどミラーリングしますが、慎重に選択した場所にEIOを注入するファイルシステムをすばやく作成するための開始例が付属しています。次の既存のファイルシステムがあります。petarddevs(記事)、それが基本的にどれだけうまく機能するかわかりません。
別の方法はLD_PRELOAD
包装紙。既存のもの図書館(ユーザー空間へのエラー注入)。 POSIX API呼び出しをオーバーロードするライブラリを事前にロードして機能します。簡単な指示や任意のCコードを書くことで、通常の動作をオーバーライドできます。
答え4
この目的のために特別に作成されたCharybdeFSを使用できます。
PetardFSに似ていますが、より構成可能なパススルーヒューズファイルシステムです。
ここでCharybdeFSレシピをご覧ください。http://www.scyladb.com/2016/05/02/fault-injection-filesystem-cookbook/
データベースをテストするのに十分な進歩を遂げました。