Summary: Added necessary routines for dumping block based SST with block filter Test Plan: Added "raw" mode to utility sst_dump Reviewers: sdong, rven Reviewed By: rven Subscribers: dhruba Differential Revision: https://reviews.facebook.net/D29679main
parent
ae508df90e
commit
7ea7bdf04d
@ -0,0 +1,152 @@ |
||||
// 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.
|
||||
//
|
||||
// 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 <stdint.h> |
||||
#include "rocksdb/sst_dump_tool.h" |
||||
|
||||
#include "rocksdb/filter_policy.h" |
||||
#include "table/block_based_table_factory.h" |
||||
#include "table/table_builder.h" |
||||
#include "util/testharness.h" |
||||
#include "util/testutil.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
const uint32_t optLength = 100; |
||||
|
||||
namespace { |
||||
static std::string MakeKey(int i) { |
||||
char buf[100]; |
||||
snprintf(buf, sizeof(buf), "k_%04d", i); |
||||
InternalKey key(std::string(buf), 0, ValueType::kTypeValue); |
||||
return key.Encode().ToString(); |
||||
} |
||||
|
||||
static std::string MakeValue(int i) { |
||||
char buf[100]; |
||||
snprintf(buf, sizeof(buf), "v_%04d", i); |
||||
InternalKey key(std::string(buf), 0, ValueType::kTypeValue); |
||||
return key.Encode().ToString(); |
||||
} |
||||
|
||||
void createSST(const std::string& file_name, |
||||
const BlockBasedTableOptions& table_options) { |
||||
std::shared_ptr<rocksdb::TableFactory> tf; |
||||
tf.reset(new rocksdb::BlockBasedTableFactory(table_options)); |
||||
|
||||
unique_ptr<WritableFile> file; |
||||
Env* env = Env::Default(); |
||||
EnvOptions env_options; |
||||
ReadOptions read_options; |
||||
Options opts; |
||||
const ImmutableCFOptions imoptions(opts); |
||||
rocksdb::InternalKeyComparator ikc(opts.comparator); |
||||
TableBuilder* tb = nullptr; |
||||
|
||||
env->NewWritableFile(file_name, &file, env_options); |
||||
opts.table_factory = tf; |
||||
tb = opts.table_factory->NewTableBuilder(imoptions, ikc, file.get(), |
||||
CompressionType::kNoCompression, |
||||
CompressionOptions()); |
||||
|
||||
// Populate slightly more than 1K keys
|
||||
uint32_t num_keys = 1024; |
||||
for (uint32_t i = 0; i < num_keys; i++) { |
||||
tb->Add(MakeKey(i), MakeValue(i)); |
||||
} |
||||
tb->Finish(); |
||||
file->Close(); |
||||
} |
||||
|
||||
void cleanup(const std::string& file_name) { |
||||
Env* env = Env::Default(); |
||||
env->DeleteFile(file_name); |
||||
std::string outfile_name = file_name.substr(0, file_name.length() - 4); |
||||
outfile_name.append("_dump.txt"); |
||||
env->DeleteFile(outfile_name); |
||||
} |
||||
} // namespace
|
||||
|
||||
// Test for sst dump tool "raw" mode
|
||||
class SSTDumpToolTest { |
||||
public: |
||||
BlockBasedTableOptions table_options_; |
||||
|
||||
SSTDumpToolTest() {} |
||||
|
||||
~SSTDumpToolTest() {} |
||||
}; |
||||
|
||||
TEST(SSTDumpToolTest, EmptyFilter) { |
||||
std::string file_name = "rocksdb_sst_test.sst"; |
||||
createSST(file_name, table_options_); |
||||
|
||||
char* usage[3]; |
||||
for (int i = 0; i < 3; i++) { |
||||
usage[i] = new char[optLength]; |
||||
} |
||||
snprintf(usage[0], optLength, "./sst_dump"); |
||||
snprintf(usage[1], optLength, "--command=raw"); |
||||
snprintf(usage[2], optLength, "--file=rocksdb_sst_test.sst"); |
||||
|
||||
rocksdb::SSTDumpTool tool; |
||||
ASSERT_TRUE(!tool.Run(3, usage)); |
||||
|
||||
cleanup(file_name); |
||||
for (int i = 0; i < 3; i++) { |
||||
delete[] usage[i]; |
||||
} |
||||
} |
||||
|
||||
TEST(SSTDumpToolTest, FilterBlock) { |
||||
table_options_.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10, true)); |
||||
std::string file_name = "rocksdb_sst_test.sst"; |
||||
createSST(file_name, table_options_); |
||||
|
||||
char* usage[3]; |
||||
for (int i = 0; i < 3; i++) { |
||||
usage[i] = new char[optLength]; |
||||
} |
||||
snprintf(usage[0], optLength, "./sst_dump"); |
||||
snprintf(usage[1], optLength, "--command=raw"); |
||||
snprintf(usage[2], optLength, "--file=rocksdb_sst_test.sst"); |
||||
|
||||
rocksdb::SSTDumpTool tool; |
||||
ASSERT_TRUE(!tool.Run(3, usage)); |
||||
|
||||
cleanup(file_name); |
||||
for (int i = 0; i < 3; i++) { |
||||
delete[] usage[i]; |
||||
} |
||||
} |
||||
|
||||
TEST(SSTDumpToolTest, FullFilterBlock) { |
||||
table_options_.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10, false)); |
||||
std::string file_name = "rocksdb_sst_test.sst"; |
||||
createSST(file_name, table_options_); |
||||
|
||||
char* usage[3]; |
||||
for (int i = 0; i < 3; i++) { |
||||
usage[i] = new char[optLength]; |
||||
} |
||||
snprintf(usage[0], optLength, "./sst_dump"); |
||||
snprintf(usage[1], optLength, "--command=raw"); |
||||
snprintf(usage[2], optLength, "--file=rocksdb_sst_test.sst"); |
||||
|
||||
rocksdb::SSTDumpTool tool; |
||||
ASSERT_TRUE(!tool.Run(3, usage)); |
||||
|
||||
cleanup(file_name); |
||||
for (int i = 0; i < 3; i++) { |
||||
delete[] usage[i]; |
||||
} |
||||
} |
||||
} // namespace rocksdb
|
||||
|
||||
int main(int argc, char** argv) { return rocksdb::test::RunAllTests(); } |
Loading…
Reference in new issue