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