212

MongoDB の Java Connection driver のこのコミットで次のコードを見ましたが、最初はある種の冗談のように見えます。次のコードは何をしますか?

if (!((_ok) ? true : (Math.random() > 0.1))) {
    return res;
}

(編集:この質問を投稿してからコードが更新されました)

4

4 に答える 4

17

https://github.com/mongodb/mongo-java-driver/commit/d51b3648a8e1bf1a7b7886b7ceb343064c9e2225#commitcomment-3315694

11 時間前 gareth-rees:

おそらく、カウンターやタイマーを維持するコストを負担することなく、サーバー障害の約 1/10 のみをログに記録する (したがって、ログに大量のスパムを送信しないようにする) という考えです。(しかし、確かにタイマーを維持することは手頃な価格でしょうか?)

于 2013-05-30T10:05:28.010 に答える
7

負の 1 に初期化されたクラス メンバーを追加します。

  private int logit = -1;

try ブロックで、テストを行います。

 if( !ok && (logit = (logit + 1 ) % 10)  == 0 ) { //log error

これは常に最初のエラーをログに記録し、その後は 10 番目のエラーごとにログに記録します。論理演算子は「短絡」するため、logit は実際のエラーでのみインクリメントされます。

接続に関係なく、すべてのエラーの 1 番目と 10 番目が必要な場合は、aa メンバーではなく logit クラスを static にします。

指摘されていたように、これはスレッドセーフである必要があります。

private synchronized int getLogit() {
   return (logit = (logit + 1 ) % 10);
}

try ブロックで、テストを行います。

 if( !ok && getLogit() == 0 ) { //log error

注: エラーの 90% を捨てるのは良い考えではないと思います。

于 2013-05-31T15:54:26.493 に答える