Summary: The new table factory is used if users want to convert a DB from one table format to the other. A user can use this table to open a DB written using one table format and write new files to another table format. Test Plan: add a unit test Reviewers: haobo, igor Reviewed By: igor Subscribers: dhruba, ljin, yhchiang, leveldb Differential Revision: https://reviews.facebook.net/D19017main
parent
4f18bfe376
commit
200e4b4a72
@ -0,0 +1,73 @@ |
||||
// Copyright (c) 2011 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.
|
||||
|
||||
#ifndef ROCKSDB_LITE |
||||
#include "table/adaptive_table_factory.h" |
||||
|
||||
#include "table/format.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
AdaptiveTableFactory::AdaptiveTableFactory( |
||||
std::shared_ptr<TableFactory> block_based_table_factory, |
||||
std::shared_ptr<TableFactory> plain_table_factory, |
||||
std::shared_ptr<TableFactory> table_factory_to_write) |
||||
: block_based_table_factory_(block_based_table_factory), |
||||
plain_table_factory_(plain_table_factory), |
||||
table_factory_to_write_(table_factory_to_write) { |
||||
if (!plain_table_factory_) { |
||||
plain_table_factory_.reset(NewPlainTableFactory()); |
||||
} |
||||
if (!block_based_table_factory_) { |
||||
block_based_table_factory_.reset(NewBlockBasedTableFactory()); |
||||
} |
||||
if (!table_factory_to_write_) { |
||||
table_factory_to_write_ = block_based_table_factory_; |
||||
} |
||||
} |
||||
|
||||
extern const uint64_t kPlainTableMagicNumber; |
||||
extern const uint64_t kLegacyPlainTableMagicNumber; |
||||
extern const uint64_t kBlockBasedTableMagicNumber; |
||||
extern const uint64_t kLegacyBlockBasedTableMagicNumber; |
||||
|
||||
Status AdaptiveTableFactory::NewTableReader( |
||||
const Options& options, const EnvOptions& soptions, |
||||
const InternalKeyComparator& icomp, unique_ptr<RandomAccessFile>&& file, |
||||
uint64_t file_size, unique_ptr<TableReader>* table) const { |
||||
Footer footer; |
||||
auto s = ReadFooterFromFile(file.get(), file_size, &footer); |
||||
if (!s.ok()) { |
||||
return s; |
||||
} |
||||
if (footer.table_magic_number() == kPlainTableMagicNumber || |
||||
footer.table_magic_number() == kLegacyPlainTableMagicNumber) { |
||||
return plain_table_factory_->NewTableReader( |
||||
options, soptions, icomp, std::move(file), file_size, table); |
||||
} else if (footer.table_magic_number() == kBlockBasedTableMagicNumber || |
||||
footer.table_magic_number() == kLegacyBlockBasedTableMagicNumber) { |
||||
return block_based_table_factory_->NewTableReader( |
||||
options, soptions, icomp, std::move(file), file_size, table); |
||||
} else { |
||||
return Status::NotSupported("Unidentified table format"); |
||||
} |
||||
} |
||||
|
||||
TableBuilder* AdaptiveTableFactory::NewTableBuilder( |
||||
const Options& options, const InternalKeyComparator& internal_comparator, |
||||
WritableFile* file, CompressionType compression_type) const { |
||||
return table_factory_to_write_->NewTableBuilder(options, internal_comparator, |
||||
file, compression_type); |
||||
} |
||||
|
||||
extern TableFactory* NewAdaptiveTableFactory( |
||||
std::shared_ptr<TableFactory> block_based_table_factory, |
||||
std::shared_ptr<TableFactory> plain_table_factory, |
||||
std::shared_ptr<TableFactory> table_factory_to_write) { |
||||
return new AdaptiveTableFactory( |
||||
block_based_table_factory, plain_table_factory, table_factory_to_write); |
||||
} |
||||
|
||||
} // namespace rocksdb
|
||||
#endif // ROCKSDB_LITE
|
@ -0,0 +1,50 @@ |
||||
// Copyright (c) 2011 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.
|
||||
|
||||
#pragma once |
||||
|
||||
#ifndef ROCKSDB_LITE |
||||
|
||||
#include "rocksdb/options.h" |
||||
#include "rocksdb/table.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
struct Options; |
||||
struct EnvOptions; |
||||
|
||||
using std::unique_ptr; |
||||
class Status; |
||||
class RandomAccessFile; |
||||
class WritableFile; |
||||
class Table; |
||||
class TableBuilder; |
||||
|
||||
class AdaptiveTableFactory : public TableFactory { |
||||
public: |
||||
~AdaptiveTableFactory() {} |
||||
|
||||
explicit AdaptiveTableFactory( |
||||
std::shared_ptr<TableFactory> block_based_table_factory, |
||||
std::shared_ptr<TableFactory> plain_table_factory, |
||||
std::shared_ptr<TableFactory> table_factory_to_write); |
||||
const char* Name() const override { return "AdaptiveTableFactory"; } |
||||
Status NewTableReader(const Options& options, const EnvOptions& soptions, |
||||
const InternalKeyComparator& internal_comparator, |
||||
unique_ptr<RandomAccessFile>&& file, uint64_t file_size, |
||||
unique_ptr<TableReader>* table) const override; |
||||
TableBuilder* NewTableBuilder(const Options& options, |
||||
const InternalKeyComparator& icomparator, |
||||
WritableFile* file, |
||||
CompressionType compression_type) const |
||||
override; |
||||
|
||||
private: |
||||
std::shared_ptr<TableFactory> block_based_table_factory_; |
||||
std::shared_ptr<TableFactory> plain_table_factory_; |
||||
std::shared_ptr<TableFactory> table_factory_to_write_; |
||||
}; |
||||
|
||||
} // namespace rocksdb
|
||||
#endif // ROCKSDB_LITE
|
Loading…
Reference in new issue