From 3a0e98d558194eab4ec94de92acdc031fe4ccaf0 Mon Sep 17 00:00:00 2001 From: Kai Liu Date: Wed, 4 Dec 2013 15:09:41 -0800 Subject: [PATCH] Parameterize table magic number Summary: As we are having different types of tables and they all might share the same structure in block-based table: [metaindex block] [index block] [Footer] To be able to identify differnt types of tables, we need to parameterize the "magic number" in the `Footer`. Test Plan: make check --- table/block_based_table_builder.cc | 10 +++++++++- table/block_based_table_builder.h | 1 - table/block_based_table_reader.cc | 4 +++- table/format.h | 13 +++++++------ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/table/block_based_table_builder.cc b/table/block_based_table_builder.cc index f846b1ffd..fa7d56472 100644 --- a/table/block_based_table_builder.cc +++ b/table/block_based_table_builder.cc @@ -77,6 +77,14 @@ void LogPropertiesCollectionError( } // anonymous namespace +// kBlockedBasedTableMagicNumber was picked by running +// echo http://code.google.com/p/leveldb/ | sha1sum +// and taking the leading 64 bits. +// Please note that kBlockedBasedTableMagicNumber may also be accessed by +// other .cc files so it have to be explicitly declared with "extern". +extern const uint64_t kBlockedBasedTableMagicNumber + = 0xdb4775248b80fb57ull; + struct BlockBasedTableBuilder::Rep { Options options; WritableFile* file; @@ -503,7 +511,7 @@ Status BlockBasedTableBuilder::Finish() { // Write footer if (ok()) { - Footer footer; + Footer footer(kBlockedBasedTableMagicNumber); footer.set_metaindex_handle(metaindex_block_handle); footer.set_index_handle(index_block_handle); std::string footer_encoding; diff --git a/table/block_based_table_builder.h b/table/block_based_table_builder.h index 517f8e785..710bfd5a1 100644 --- a/table/block_based_table_builder.h +++ b/table/block_based_table_builder.h @@ -20,7 +20,6 @@ class BlockBuilder; class BlockHandle; class WritableFile; - class BlockBasedTableBuilder : public TableBuilder { public: // Create a builder that will store the contents of the table it is diff --git a/table/block_based_table_reader.cc b/table/block_based_table_reader.cc index 095c2999c..d5b52fba2 100644 --- a/table/block_based_table_reader.cc +++ b/table/block_based_table_reader.cc @@ -29,6 +29,8 @@ namespace rocksdb { +extern uint64_t kBlockedBasedTableMagicNumber; + // The longest the prefix of the cache key used to identify blocks can be. // We are using the fact that we know for Posix files the unique ID is three // varints. @@ -242,7 +244,7 @@ Status BlockBasedTable::Open(const Options& options, return Status::InvalidArgument("file is too short to be an sstable"); } - Footer footer; + Footer footer(kBlockedBasedTableMagicNumber); s = footer.DecodeFrom(&footer_input); if (!s.ok()) return s; diff --git a/table/format.h b/table/format.h index 2f1c1e8dc..bac51eab4 100644 --- a/table/format.h +++ b/table/format.h @@ -50,7 +50,12 @@ class BlockHandle { // end of every table file. class Footer { public: - Footer() { } + // @table_magic_number serves two purposes: + // 1. Identify different types of the tables. + // 2. Help us to identify if a given file is a valid sst. + Footer(uint64_t table_magic_number) : + kTableMagicNumber(table_magic_number) { + } // The block handle for the metaindex block of the table const BlockHandle& metaindex_handle() const { return metaindex_handle_; } @@ -77,13 +82,9 @@ class Footer { private: BlockHandle metaindex_handle_; BlockHandle index_handle_; + const uint64_t kTableMagicNumber; }; -// kTableMagicNumber was picked by running -// echo http://code.google.com/p/leveldb/ | sha1sum -// and taking the leading 64 bits. -static const uint64_t kTableMagicNumber = 0xdb4775248b80fb57ull; - // 1-byte type + 32-bit crc static const size_t kBlockTrailerSize = 5;