]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/db/table_properties_collector.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / rocksdb / db / table_properties_collector.h
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 // This file defines a collection of statistics collectors.
7 #pragma once
8
9 #include "rocksdb/table_properties.h"
10
11 #include <memory>
12 #include <string>
13 #include <vector>
14
15 namespace ROCKSDB_NAMESPACE {
16
17 // Base class for internal table properties collector.
18 class IntTblPropCollector {
19 public:
20 virtual ~IntTblPropCollector() {}
21 virtual Status Finish(UserCollectedProperties* properties) = 0;
22
23 virtual const char* Name() const = 0;
24
25 // @params key the user key that is inserted into the table.
26 // @params value the value that is inserted into the table.
27 virtual Status InternalAdd(const Slice& key, const Slice& value,
28 uint64_t file_size) = 0;
29
30 virtual void BlockAdd(uint64_t blockRawBytes,
31 uint64_t blockCompressedBytesFast,
32 uint64_t blockCompressedBytesSlow) = 0;
33
34 virtual UserCollectedProperties GetReadableProperties() const = 0;
35
36 virtual bool NeedCompact() const { return false; }
37 };
38
39 // Factory for internal table properties collector.
40 class IntTblPropCollectorFactory {
41 public:
42 virtual ~IntTblPropCollectorFactory() {}
43 // has to be thread-safe
44 virtual IntTblPropCollector* CreateIntTblPropCollector(
45 uint32_t column_family_id) = 0;
46
47 // The name of the properties collector can be used for debugging purpose.
48 virtual const char* Name() const = 0;
49 };
50
51 // When rocksdb creates a new table, it will encode all "user keys" into
52 // "internal keys", which contains meta information of a given entry.
53 //
54 // This class extracts user key from the encoded internal key when Add() is
55 // invoked.
56 class UserKeyTablePropertiesCollector : public IntTblPropCollector {
57 public:
58 // transfer of ownership
59 explicit UserKeyTablePropertiesCollector(TablePropertiesCollector* collector)
60 : collector_(collector) {}
61
62 virtual ~UserKeyTablePropertiesCollector() {}
63
64 virtual Status InternalAdd(const Slice& key, const Slice& value,
65 uint64_t file_size) override;
66
67 virtual void BlockAdd(uint64_t blockRawBytes,
68 uint64_t blockCompressedBytesFast,
69 uint64_t blockCompressedBytesSlow) override;
70
71 virtual Status Finish(UserCollectedProperties* properties) override;
72
73 virtual const char* Name() const override { return collector_->Name(); }
74
75 UserCollectedProperties GetReadableProperties() const override;
76
77 virtual bool NeedCompact() const override {
78 return collector_->NeedCompact();
79 }
80
81 protected:
82 std::unique_ptr<TablePropertiesCollector> collector_;
83 };
84
85 class UserKeyTablePropertiesCollectorFactory
86 : public IntTblPropCollectorFactory {
87 public:
88 explicit UserKeyTablePropertiesCollectorFactory(
89 std::shared_ptr<TablePropertiesCollectorFactory> user_collector_factory)
90 : user_collector_factory_(user_collector_factory) {}
91 virtual IntTblPropCollector* CreateIntTblPropCollector(
92 uint32_t column_family_id) override {
93 TablePropertiesCollectorFactory::Context context;
94 context.column_family_id = column_family_id;
95 return new UserKeyTablePropertiesCollector(
96 user_collector_factory_->CreateTablePropertiesCollector(context));
97 }
98
99 virtual const char* Name() const override {
100 return user_collector_factory_->Name();
101 }
102
103 private:
104 std::shared_ptr<TablePropertiesCollectorFactory> user_collector_factory_;
105 };
106
107 } // namespace ROCKSDB_NAMESPACE