]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/table/adaptive_table_factory.cc
bump version to 15.2.11-pve1
[ceph.git] / ceph / src / rocksdb / table / adaptive_table_factory.cc
CommitLineData
7c673cae
FG
1// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file. See the AUTHORS file for names of contributors.
4
5#ifndef ROCKSDB_LITE
6#include "table/adaptive_table_factory.h"
7
8#include "table/table_builder.h"
9#include "table/format.h"
10#include "port/port.h"
11
12namespace rocksdb {
13
14AdaptiveTableFactory::AdaptiveTableFactory(
15 std::shared_ptr<TableFactory> table_factory_to_write,
16 std::shared_ptr<TableFactory> block_based_table_factory,
17 std::shared_ptr<TableFactory> plain_table_factory,
18 std::shared_ptr<TableFactory> cuckoo_table_factory)
19 : table_factory_to_write_(table_factory_to_write),
20 block_based_table_factory_(block_based_table_factory),
21 plain_table_factory_(plain_table_factory),
22 cuckoo_table_factory_(cuckoo_table_factory) {
23 if (!plain_table_factory_) {
24 plain_table_factory_.reset(NewPlainTableFactory());
25 }
26 if (!block_based_table_factory_) {
27 block_based_table_factory_.reset(NewBlockBasedTableFactory());
28 }
29 if (!cuckoo_table_factory_) {
30 cuckoo_table_factory_.reset(NewCuckooTableFactory());
31 }
32 if (!table_factory_to_write_) {
33 table_factory_to_write_ = block_based_table_factory_;
34 }
35}
36
37extern const uint64_t kPlainTableMagicNumber;
38extern const uint64_t kLegacyPlainTableMagicNumber;
39extern const uint64_t kBlockBasedTableMagicNumber;
40extern const uint64_t kLegacyBlockBasedTableMagicNumber;
41extern const uint64_t kCuckooTableMagicNumber;
42
43Status AdaptiveTableFactory::NewTableReader(
44 const TableReaderOptions& table_reader_options,
494da23a
TL
45 std::unique_ptr<RandomAccessFileReader>&& file, uint64_t file_size,
46 std::unique_ptr<TableReader>* table,
11fdf7f2 47 bool /*prefetch_index_and_filter_in_cache*/) const {
7c673cae 48 Footer footer;
11fdf7f2
TL
49 auto s = ReadFooterFromFile(file.get(), nullptr /* prefetch_buffer */,
50 file_size, &footer);
7c673cae
FG
51 if (!s.ok()) {
52 return s;
53 }
54 if (footer.table_magic_number() == kPlainTableMagicNumber ||
55 footer.table_magic_number() == kLegacyPlainTableMagicNumber) {
56 return plain_table_factory_->NewTableReader(
57 table_reader_options, std::move(file), file_size, table);
58 } else if (footer.table_magic_number() == kBlockBasedTableMagicNumber ||
59 footer.table_magic_number() == kLegacyBlockBasedTableMagicNumber) {
60 return block_based_table_factory_->NewTableReader(
61 table_reader_options, std::move(file), file_size, table);
62 } else if (footer.table_magic_number() == kCuckooTableMagicNumber) {
63 return cuckoo_table_factory_->NewTableReader(
64 table_reader_options, std::move(file), file_size, table);
65 } else {
66 return Status::NotSupported("Unidentified table format");
67 }
68}
69
70TableBuilder* AdaptiveTableFactory::NewTableBuilder(
71 const TableBuilderOptions& table_builder_options, uint32_t column_family_id,
72 WritableFileWriter* file) const {
73 return table_factory_to_write_->NewTableBuilder(table_builder_options,
74 column_family_id, file);
75}
76
77std::string AdaptiveTableFactory::GetPrintableTableOptions() const {
78 std::string ret;
79 ret.reserve(20000);
80 const int kBufferSize = 200;
81 char buffer[kBufferSize];
82
83 if (table_factory_to_write_) {
84 snprintf(buffer, kBufferSize, " write factory (%s) options:\n%s\n",
85 (table_factory_to_write_->Name() ? table_factory_to_write_->Name()
86 : ""),
87 table_factory_to_write_->GetPrintableTableOptions().c_str());
88 ret.append(buffer);
89 }
90 if (plain_table_factory_) {
91 snprintf(buffer, kBufferSize, " %s options:\n%s\n",
92 plain_table_factory_->Name() ? plain_table_factory_->Name() : "",
93 plain_table_factory_->GetPrintableTableOptions().c_str());
94 ret.append(buffer);
95 }
96 if (block_based_table_factory_) {
97 snprintf(
98 buffer, kBufferSize, " %s options:\n%s\n",
99 (block_based_table_factory_->Name() ? block_based_table_factory_->Name()
100 : ""),
101 block_based_table_factory_->GetPrintableTableOptions().c_str());
102 ret.append(buffer);
103 }
104 if (cuckoo_table_factory_) {
105 snprintf(buffer, kBufferSize, " %s options:\n%s\n",
106 cuckoo_table_factory_->Name() ? cuckoo_table_factory_->Name() : "",
107 cuckoo_table_factory_->GetPrintableTableOptions().c_str());
108 ret.append(buffer);
109 }
110 return ret;
111}
112
113extern TableFactory* NewAdaptiveTableFactory(
114 std::shared_ptr<TableFactory> table_factory_to_write,
115 std::shared_ptr<TableFactory> block_based_table_factory,
116 std::shared_ptr<TableFactory> plain_table_factory,
117 std::shared_ptr<TableFactory> cuckoo_table_factory) {
118 return new AdaptiveTableFactory(table_factory_to_write,
119 block_based_table_factory, plain_table_factory, cuckoo_table_factory);
120}
121
122} // namespace rocksdb
123#endif // ROCKSDB_LITE