1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 6 #pragma once 7 #include <string> 8 #include "db/dbformat.h" 9 #include "db/table_properties_collector.h" 10 #include "rocksdb/types.h" 11 #include "util/string_util.h" 12 13 namespace ROCKSDB_NAMESPACE { 14 15 // Table Properties that are specific to tables created by SstFileWriter. 16 struct ExternalSstFilePropertyNames { 17 // value of this property is a fixed uint32 number. 18 static const std::string kVersion; 19 // value of this property is a fixed uint64 number. 20 static const std::string kGlobalSeqno; 21 }; 22 23 // PropertiesCollector used to add properties specific to tables 24 // generated by SstFileWriter 25 class SstFileWriterPropertiesCollector : public IntTblPropCollector { 26 public: SstFileWriterPropertiesCollector(int32_t version,SequenceNumber global_seqno)27 explicit SstFileWriterPropertiesCollector(int32_t version, 28 SequenceNumber global_seqno) 29 : version_(version), global_seqno_(global_seqno) {} 30 InternalAdd(const Slice &,const Slice &,uint64_t)31 virtual Status InternalAdd(const Slice& /*key*/, const Slice& /*value*/, 32 uint64_t /*file_size*/) override { 33 // Intentionally left blank. Have no interest in collecting stats for 34 // individual key/value pairs. 35 return Status::OK(); 36 } 37 BlockAdd(uint64_t,uint64_t,uint64_t)38 virtual void BlockAdd(uint64_t /* blockRawBytes */, 39 uint64_t /* blockCompressedBytesFast */, 40 uint64_t /* blockCompressedBytesSlow */) override { 41 // Intentionally left blank. No interest in collecting stats for 42 // blocks. 43 return; 44 } 45 Finish(UserCollectedProperties * properties)46 virtual Status Finish(UserCollectedProperties* properties) override { 47 // File version 48 std::string version_val; 49 PutFixed32(&version_val, static_cast<uint32_t>(version_)); 50 properties->insert({ExternalSstFilePropertyNames::kVersion, version_val}); 51 52 // Global Sequence number 53 std::string seqno_val; 54 PutFixed64(&seqno_val, static_cast<uint64_t>(global_seqno_)); 55 properties->insert({ExternalSstFilePropertyNames::kGlobalSeqno, seqno_val}); 56 57 return Status::OK(); 58 } 59 Name()60 virtual const char* Name() const override { 61 return "SstFileWriterPropertiesCollector"; 62 } 63 GetReadableProperties()64 virtual UserCollectedProperties GetReadableProperties() const override { 65 return {{ExternalSstFilePropertyNames::kVersion, ToString(version_)}}; 66 } 67 68 private: 69 int32_t version_; 70 SequenceNumber global_seqno_; 71 }; 72 73 class SstFileWriterPropertiesCollectorFactory 74 : public IntTblPropCollectorFactory { 75 public: SstFileWriterPropertiesCollectorFactory(int32_t version,SequenceNumber global_seqno)76 explicit SstFileWriterPropertiesCollectorFactory(int32_t version, 77 SequenceNumber global_seqno) 78 : version_(version), global_seqno_(global_seqno) {} 79 CreateIntTblPropCollector(uint32_t)80 virtual IntTblPropCollector* CreateIntTblPropCollector( 81 uint32_t /*column_family_id*/) override { 82 return new SstFileWriterPropertiesCollector(version_, global_seqno_); 83 } 84 Name()85 virtual const char* Name() const override { 86 return "SstFileWriterPropertiesCollector"; 87 } 88 89 private: 90 int32_t version_; 91 SequenceNumber global_seqno_; 92 }; 93 94 } // namespace ROCKSDB_NAMESPACE 95