From ee5a51e6cee1256b50ffe2271a257eb53eae4adf Mon Sep 17 00:00:00 2001 From: sdong Date: Fri, 6 Jun 2014 17:17:12 -0700 Subject: [PATCH] sst_dump: still try to print out table properties even if failing to read the file Summary: Even if the file is corrupted, table properties are usually available to print out. Now sst_dump would just fail without printing table properties. With this patch, table properties are still try to be printed out. Test Plan: run sst_dump against multiple scenarios Reviewers: igor, yhchiang, ljin, haobo Reviewed By: haobo Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D18981 --- tools/sst_dump.cc | 62 +++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/tools/sst_dump.cc b/tools/sst_dump.cc index 8e1ae35a9..e31471395 100644 --- a/tools/sst_dump.cc +++ b/tools/sst_dump.cc @@ -47,12 +47,13 @@ class SstFileReader { Status ReadTableProperties( std::shared_ptr* table_properties); uint64_t GetReadNumber() { return read_num_; } + TableProperties* GetInitTableProperties() { return table_properties_.get(); } private: Status NewTableReader(const std::string& file_path); - Status SetTableOptionsByMagicNumber(uint64_t table_magic_number, - RandomAccessFile* file, - uint64_t file_size); + Status ReadTableProperties(uint64_t table_magic_number, + RandomAccessFile* file, uint64_t file_size); + Status SetTableOptionsByMagicNumber(uint64_t table_magic_number); std::string file_name_; uint64_t read_num_; @@ -67,6 +68,7 @@ class SstFileReader { // ReadSequential internally (specifically, seek-related operations) Options options_; InternalKeyComparator internal_comparator_; + unique_ptr table_properties_; }; SstFileReader::SstFileReader(const std::string& file_path, @@ -106,7 +108,10 @@ Status SstFileReader::NewTableReader(const std::string& file_path) { soptions_.use_mmap_reads = true; } options_.comparator = &internal_comparator_; - s = SetTableOptionsByMagicNumber(magic_number, file_.get(), file_size); + s = ReadTableProperties(magic_number, file_.get(), file_size); + if (s.ok()) { + s = SetTableOptionsByMagicNumber(magic_number); + } } if (s.ok()) { @@ -117,22 +122,24 @@ Status SstFileReader::NewTableReader(const std::string& file_path) { return s; } -Status SstFileReader::SetTableOptionsByMagicNumber(uint64_t table_magic_number, - RandomAccessFile* file, - uint64_t file_size) { +Status SstFileReader::ReadTableProperties(uint64_t table_magic_number, + RandomAccessFile* file, + uint64_t file_size) { TableProperties* table_properties; Status s = rocksdb::ReadTableProperties(file, file_size, table_magic_number, options_.env, options_.info_log.get(), &table_properties); - if (!s.ok()) { - return s; - } - std::unique_ptr props_guard(table_properties); + table_properties_.reset(table_properties); + return s; +} +Status SstFileReader::SetTableOptionsByMagicNumber( + uint64_t table_magic_number) { + assert(table_properties_); if (table_magic_number == kBlockBasedTableMagicNumber) { options_.table_factory = std::make_shared(); fprintf(stdout, "Sst file format: block-based\n"); - auto& props = table_properties->user_collected_properties; + auto& props = table_properties_->user_collected_properties; auto pos = props.find(BlockBasedTablePropertyNames::kIndexType); if (pos != props.end()) { auto index_type_on_file = static_cast( @@ -145,7 +152,7 @@ Status SstFileReader::SetTableOptionsByMagicNumber(uint64_t table_magic_number, } else if (table_magic_number == kPlainTableMagicNumber) { options_.allow_mmap_reads = true; options_.table_factory = std::make_shared( - table_properties->fixed_key_len, 2, 0.8); + table_properties_->fixed_key_len, 2, 0.8); options_.prefix_extractor.reset(NewNoopTransform()); fprintf(stdout, "Sst file format: plain table\n"); } else { @@ -226,14 +233,14 @@ Status SstFileReader::ReadTableProperties( static void print_help() { fprintf(stderr, - "sst_dump [--command=check|scan] [--verify_checksum] " - "--file=data_dir_OR_sst_file" - " [--output_hex]" - " [--input_key_hex]" - " [--from=]" - " [--to=]" - " [--read_num=NUM]" - " [--show_properties]\n"); + "sst_dump [--command=check|scan|none] [--verify_checksum] " + "--file=data_dir_OR_sst_file" + " [--output_hex]" + " [--input_key_hex]" + " [--from=]" + " [--to=]" + " [--read_num=NUM]" + " [--show_properties]\n"); } namespace { @@ -299,7 +306,6 @@ int main(int argc, char** argv) { } } - if (input_key_hex) { if (has_from) { from_key = HexToString(from_key); @@ -358,11 +364,19 @@ int main(int argc, char** argv) { } } if (show_properties) { - std::shared_ptr table_properties; - st = reader.ReadTableProperties(&table_properties); + const rocksdb::TableProperties* table_properties; + + std::shared_ptr + table_properties_from_reader; + st = reader.ReadTableProperties(&table_properties_from_reader); if (!st.ok()) { fprintf(stderr, "%s: %s\n", filename.c_str(), st.ToString().c_str()); + fprintf(stderr, "Try to use initial table properties\n"); + table_properties = reader.GetInitTableProperties(); } else { + table_properties = table_properties_from_reader.get(); + } + if (table_properties != nullptr) { fprintf(stdout, "Table Properties:\n" "------------------------------\n"