Revision bb69b4ce7f93c9c94ad7719b96299790535e2d78 authored by Levi Tamasi on 13 November 2020, 01:31:28 UTC, committed by Facebook GitHub Bot on 13 November 2020, 01:33:04 UTC
Summary:
https://github.com/facebook/rocksdb/pull/7461 accidentally broke
`InternalStats::DumpCFStats` by making `DumpCFFileHistogram` overwrite
the output of `DumpCFStatsNoFileHistogram` instead of appending to it,
resulting in only the file histogram related information getting logged.
The patch fixes this by reverting to appending in `DumpCFFileHistogram`.

Fixes https://github.com/facebook/rocksdb/issues/7664 .

Pull Request resolved: https://github.com/facebook/rocksdb/pull/7666

Test Plan: Ran `make check` and checked the info log of `db_bench`.

Reviewed By: riversand963

Differential Revision: D24929051

Pulled By: ltamasi

fbshipit-source-id: 636a3d5ebb5ce23de4f3fe4f03ad3f16cb2858f8
1 parent cf9d8e4
Raw File
random_test.cc
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2012 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.

#include <cstring>
#include <vector>

#include "test_util/testharness.h"
#include "util/random.h"

using ROCKSDB_NAMESPACE::Random;

TEST(RandomTest, Uniform) {
  const int average = 20;
  for (uint32_t seed : {0, 1, 2, 37, 4096}) {
    Random r(seed);
    for (int range : {1, 2, 8, 12, 100}) {
      std::vector<int> counts(range, 0);

      for (int i = 0; i < range * average; ++i) {
        ++counts.at(r.Uniform(range));
      }
      int max_variance = static_cast<int>(std::sqrt(range) * 2 + 4);
      for (int i = 0; i < range; ++i) {
        EXPECT_GE(counts[i], std::max(1, average - max_variance));
        EXPECT_LE(counts[i], average + max_variance + 1);
      }
    }
  }
}

TEST(RandomTest, OneIn) {
  Random r(42);
  for (int range : {1, 2, 8, 12, 100, 1234}) {
    const int average = 100;
    int count = 0;
    for (int i = 0; i < average * range; ++i) {
      if (r.OneIn(range)) {
        ++count;
      }
    }
    if (range == 1) {
      EXPECT_EQ(count, average);
    } else {
      int max_variance = static_cast<int>(std::sqrt(average) * 1.5);
      EXPECT_GE(count, average - max_variance);
      EXPECT_LE(count, average + max_variance);
    }
  }
}

TEST(RandomTest, OneInOpt) {
  Random r(42);
  for (int range : {-12, 0, 1, 2, 8, 12, 100, 1234}) {
    const int average = 100;
    int count = 0;
    for (int i = 0; i < average * range; ++i) {
      if (r.OneInOpt(range)) {
        ++count;
      }
    }
    if (range < 1) {
      EXPECT_EQ(count, 0);
    } else if (range == 1) {
      EXPECT_EQ(count, average);
    } else {
      int max_variance = static_cast<int>(std::sqrt(average) * 1.5);
      EXPECT_GE(count, average - max_variance);
      EXPECT_LE(count, average + max_variance);
    }
  }
}

TEST(RandomTest, PercentTrue) {
  Random r(42);
  for (int pct : {-12, 0, 1, 2, 10, 50, 90, 98, 99, 100, 1234}) {
    const int samples = 10000;

    int count = 0;
    for (int i = 0; i < samples; ++i) {
      if (r.PercentTrue(pct)) {
        ++count;
      }
    }
    if (pct <= 0) {
      EXPECT_EQ(count, 0);
    } else if (pct >= 100) {
      EXPECT_EQ(count, samples);
    } else {
      int est = (count * 100 + (samples / 2)) / samples;
      EXPECT_EQ(est, pct);
    }
  }
}

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);

  return RUN_ALL_TESTS();
}
back to top