]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/examples/options_file_example.cc
bump version to 12.2.12-pve1
[ceph.git] / ceph / src / rocksdb / examples / options_file_example.cc
CommitLineData
7c673cae
FG
1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2// This source code is licensed under the BSD-style license found in the
3// LICENSE file in the root directory of this source tree. An additional grant
4// of patent rights can be found in the PATENTS file in the same directory.
5//
6// This file demonstrates how to use the utility functions defined in
7// rocksdb/utilities/options_util.h to open a rocksdb database without
8// remembering all the rocksdb options.
9#include <cstdio>
10#include <string>
11#include <vector>
12
13#include "rocksdb/cache.h"
14#include "rocksdb/compaction_filter.h"
15#include "rocksdb/db.h"
16#include "rocksdb/options.h"
17#include "rocksdb/slice.h"
18#include "rocksdb/table.h"
19#include "rocksdb/utilities/options_util.h"
20
21using namespace rocksdb;
22
23std::string kDBPath = "/tmp/rocksdb_options_file_example";
24
25namespace {
26// A dummy compaction filter
27class DummyCompactionFilter : public CompactionFilter {
28 public:
29 virtual ~DummyCompactionFilter() {}
30 virtual bool Filter(int level, const Slice& key, const Slice& existing_value,
31 std::string* new_value, bool* value_changed) const {
32 return false;
33 }
34 virtual const char* Name() const { return "DummyCompactionFilter"; }
35};
36
37} // namespace
38
39int main() {
40 DBOptions db_opt;
41 db_opt.create_if_missing = true;
42
43 std::vector<ColumnFamilyDescriptor> cf_descs;
44 cf_descs.push_back({kDefaultColumnFamilyName, ColumnFamilyOptions()});
45 cf_descs.push_back({"new_cf", ColumnFamilyOptions()});
46
47 // initialize BlockBasedTableOptions
48 auto cache = NewLRUCache(1 * 1024 * 1024 * 1024);
49 BlockBasedTableOptions bbt_opts;
50 bbt_opts.block_size = 32 * 1024;
51 bbt_opts.block_cache = cache;
52
53 // initialize column families options
54 std::unique_ptr<CompactionFilter> compaction_filter;
55 compaction_filter.reset(new DummyCompactionFilter());
56 cf_descs[0].options.table_factory.reset(NewBlockBasedTableFactory(bbt_opts));
57 cf_descs[0].options.compaction_filter = compaction_filter.get();
58 cf_descs[1].options.table_factory.reset(NewBlockBasedTableFactory(bbt_opts));
59
60 // destroy and open DB
61 DB* db;
62 Status s = DestroyDB(kDBPath, Options(db_opt, cf_descs[0].options));
63 assert(s.ok());
64 s = DB::Open(Options(db_opt, cf_descs[0].options), kDBPath, &db);
65 assert(s.ok());
66
67 // Create column family, and rocksdb will persist the options.
68 ColumnFamilyHandle* cf;
69 s = db->CreateColumnFamily(ColumnFamilyOptions(), "new_cf", &cf);
70 assert(s.ok());
71
72 // close DB
73 delete cf;
74 delete db;
75
76 // In the following code, we will reopen the rocksdb instance using
77 // the options file stored in the db directory.
78
79 // Load the options file.
80 DBOptions loaded_db_opt;
81 std::vector<ColumnFamilyDescriptor> loaded_cf_descs;
82 s = LoadLatestOptions(kDBPath, Env::Default(), &loaded_db_opt,
83 &loaded_cf_descs);
84 assert(s.ok());
85 assert(loaded_db_opt.create_if_missing == db_opt.create_if_missing);
86
87 // Initialize pointer options for each column family
88 for (size_t i = 0; i < loaded_cf_descs.size(); ++i) {
89 auto* loaded_bbt_opt = reinterpret_cast<BlockBasedTableOptions*>(
90 loaded_cf_descs[0].options.table_factory->GetOptions());
91 // Expect the same as BlockBasedTableOptions will be loaded form file.
92 assert(loaded_bbt_opt->block_size == bbt_opts.block_size);
93 // However, block_cache needs to be manually initialized as documented
94 // in rocksdb/utilities/options_util.h.
95 loaded_bbt_opt->block_cache = cache;
96 }
97 // In addition, as pointer options are initialized with default value,
98 // we need to properly initialized all the pointer options if non-defalut
99 // values are used before calling DB::Open().
100 assert(loaded_cf_descs[0].options.compaction_filter == nullptr);
101 loaded_cf_descs[0].options.compaction_filter = compaction_filter.get();
102
103 // reopen the db using the loaded options.
104 std::vector<ColumnFamilyHandle*> handles;
105 s = DB::Open(loaded_db_opt, kDBPath, loaded_cf_descs, &handles, &db);
106 assert(s.ok());
107
108 // close DB
109 for (auto* handle : handles) {
110 delete handle;
111 }
112 delete db;
113}