log_and_apply_bench.cc 2.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
//  Copyright (c) 2013, Facebook, Inc.  All rights reserved.
//  This source code is licensed under the BSD-style license found in the
//  LICENSE file in the root directory of this source tree. An additional grant
//  of patent rights can be found in the PATENTS file in the same directory.


#include <vector>

#include "util/testharness.h"
#include "util/benchharness.h"
#include "db/version_set.h"
I
Igor Canadi 已提交
12
#include "db/write_controller.h"
13 14 15 16 17 18 19 20 21 22 23 24
#include "util/mutexlock.h"

namespace rocksdb {

std::string MakeKey(unsigned int num) {
  char buf[30];
  snprintf(buf, sizeof(buf), "%016u", num);
  return std::string(buf);
}

void BM_LogAndApply(int iters, int num_base_files) {
  VersionSet* vset;
25
  WriteController wc;
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
  ColumnFamilyData* default_cfd;
  uint64_t fnum = 1;
  port::Mutex mu;
  MutexLock l(&mu);

  BENCHMARK_SUSPEND {
    std::string dbname = test::TmpDir() + "/rocksdb_test_benchmark";
    ASSERT_OK(DestroyDB(dbname, Options()));

    DB* db = nullptr;
    Options opts;
    opts.create_if_missing = true;
    Status s = DB::Open(opts, dbname, &db);
    ASSERT_OK(s);
    ASSERT_TRUE(db != nullptr);

    delete db;
    db = nullptr;

    Options options;
    EnvOptions sopt;
S
sdong 已提交
47 48 49 50 51
    // Notice we are using the default options not through SanitizeOptions().
    // We might want to initialize some options manually if needed.
    options.db_paths.emplace_back(dbname, 0);
    // The parameter of table cache is passed in as null, so any file I/O
    // operation is likely to fail.
52
    vset = new VersionSet(dbname, &options, sopt, nullptr, &wc);
53 54 55 56 57 58 59 60
    std::vector<ColumnFamilyDescriptor> dummy;
    dummy.push_back(ColumnFamilyDescriptor());
    ASSERT_OK(vset->Recover(dummy));
    default_cfd = vset->GetColumnFamilySet()->GetDefault();
    VersionEdit vbase;
    for (int i = 0; i < num_base_files; i++) {
      InternalKey start(MakeKey(2 * fnum), 1, kTypeValue);
      InternalKey limit(MakeKey(2 * fnum + 1), 1, kTypeDeletion);
61
      vbase.AddFile(2, ++fnum, 0, 1 /* file size */, start, limit, 1, 1);
62
    }
63 64
    ASSERT_OK(vset->LogAndApply(default_cfd,
          *default_cfd->GetLatestMutableCFOptions(), &vbase, &mu));
65 66 67 68 69 70 71
  }

  for (int i = 0; i < iters; i++) {
    VersionEdit vedit;
    vedit.DeleteFile(2, fnum);
    InternalKey start(MakeKey(2 * fnum), 1, kTypeValue);
    InternalKey limit(MakeKey(2 * fnum + 1), 1, kTypeDeletion);
72
    vedit.AddFile(2, ++fnum, 0, 1 /* file size */, start, limit, 1, 1);
73 74
    vset->LogAndApply(default_cfd, *default_cfd->GetLatestMutableCFOptions(),
                      &vedit, &mu);
75
  }
76
  delete vset;
77 78 79 80 81 82 83 84 85 86 87 88 89
}

BENCHMARK_NAMED_PARAM(BM_LogAndApply, 1000_iters_1_file, 1000, 1)
BENCHMARK_NAMED_PARAM(BM_LogAndApply, 1000_iters_100_files, 1000, 100)
BENCHMARK_NAMED_PARAM(BM_LogAndApply, 1000_iters_10000_files, 1000, 10000)
BENCHMARK_NAMED_PARAM(BM_LogAndApply, 100_iters_100000_files, 100, 100000)

}  // namespace rocksdb

int main(int argc, char** argv) {
  rocksdb::benchmark::RunBenchmarks();
  return 0;
}