遅い Redis サーバーを模倣する最も簡単な方法を探しています (現在デバッグしているクライアントの観点から)。
理想的にはDEBUG SLEEP <seconds>
コマンドですが、AFAIKにはそのようなものはありません。
たとえば、BLPOP
ブロック読み取りに使用できますが、ブロックを解除するには別のスレッドが必要です...もっと簡単な方法はありますか?
実際には、必要な処理を正確に実行するdebugsleepコマンドがあります。これは、debug.cファイルで次のように定義されています。
} else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) {
double dtime = strtod(c->argv[2]->ptr,NULL);
long long utime = dtime*1000000;
usleep(utime);
addReply(c,shared.ok);
} else {
1つの接続のみをブロックするBLPOPとは対照的に、Redisイベントループ全体(すべての接続)をブロックすることに注意してください。
> ./redis-cli debug sleep 2
... 2 seconds wait ...
OK
BLPOPでは、タイムアウトを指定できるため、2番目のスレッドは必要ありません。
> ./redis-cli blpop dummy_key_which_does_not_exist 2
... 2 seconds wait ...
(nil)
Redisを応答不能にする別の方法は、STOPおよびCONT信号を送信することです。インスタンスのpidを取得したら、次を起動します。
kill -STOP $pid
sleep 1
kill -CONT $pid
このシグナルトリックを使用すると、redisインスタンスのすべてのスレッドがフリーズします(つまり、イベントループだけではありません)。これには、I/Oバックグラウンドスレッドが含まれます。