1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under the BSD-style license found in the
3 // LICENSE file in the root directory of this source tree. An additional grant
4 // of patent rights can be found in the PATENTS file in the same directory.
6 // This file defines a collection of statistics collectors.
9 #include "rocksdb/table_properties.h"
17 struct InternalKeyTablePropertiesNames
{
18 static const std::string kDeletedKeys
;
19 static const std::string kMergeOperands
;
22 // Base class for internal table properties collector.
23 class IntTblPropCollector
{
25 virtual ~IntTblPropCollector() {}
26 virtual Status
Finish(UserCollectedProperties
* properties
) = 0;
28 virtual const char* Name() const = 0;
30 // @params key the user key that is inserted into the table.
31 // @params value the value that is inserted into the table.
32 virtual Status
InternalAdd(const Slice
& key
, const Slice
& value
,
33 uint64_t file_size
) = 0;
35 virtual UserCollectedProperties
GetReadableProperties() const = 0;
37 virtual bool NeedCompact() const { return false; }
40 // Factory for internal table properties collector.
41 class IntTblPropCollectorFactory
{
43 virtual ~IntTblPropCollectorFactory() {}
44 // has to be thread-safe
45 virtual IntTblPropCollector
* CreateIntTblPropCollector(
46 uint32_t column_family_id
) = 0;
48 // The name of the properties collector can be used for debugging purpose.
49 virtual const char* Name() const = 0;
52 // Collecting the statistics for internal keys. Visible only by internal
54 class InternalKeyPropertiesCollector
: public IntTblPropCollector
{
56 virtual Status
InternalAdd(const Slice
& key
, const Slice
& value
,
57 uint64_t file_size
) override
;
59 virtual Status
Finish(UserCollectedProperties
* properties
) override
;
61 virtual const char* Name() const override
{
62 return "InternalKeyPropertiesCollector";
65 UserCollectedProperties
GetReadableProperties() const override
;
68 uint64_t deleted_keys_
= 0;
69 uint64_t merge_operands_
= 0;
72 class InternalKeyPropertiesCollectorFactory
73 : public IntTblPropCollectorFactory
{
75 virtual IntTblPropCollector
* CreateIntTblPropCollector(
76 uint32_t column_family_id
) override
{
77 return new InternalKeyPropertiesCollector();
80 virtual const char* Name() const override
{
81 return "InternalKeyPropertiesCollectorFactory";
85 // When rocksdb creates a new table, it will encode all "user keys" into
86 // "internal keys", which contains meta information of a given entry.
88 // This class extracts user key from the encoded internal key when Add() is
90 class UserKeyTablePropertiesCollector
: public IntTblPropCollector
{
92 // transfer of ownership
93 explicit UserKeyTablePropertiesCollector(TablePropertiesCollector
* collector
)
94 : collector_(collector
) {}
96 virtual ~UserKeyTablePropertiesCollector() {}
98 virtual Status
InternalAdd(const Slice
& key
, const Slice
& value
,
99 uint64_t file_size
) override
;
101 virtual Status
Finish(UserCollectedProperties
* properties
) override
;
103 virtual const char* Name() const override
{ return collector_
->Name(); }
105 UserCollectedProperties
GetReadableProperties() const override
;
107 virtual bool NeedCompact() const override
{
108 return collector_
->NeedCompact();
112 std::unique_ptr
<TablePropertiesCollector
> collector_
;
115 class UserKeyTablePropertiesCollectorFactory
116 : public IntTblPropCollectorFactory
{
118 explicit UserKeyTablePropertiesCollectorFactory(
119 std::shared_ptr
<TablePropertiesCollectorFactory
> user_collector_factory
)
120 : user_collector_factory_(user_collector_factory
) {}
121 virtual IntTblPropCollector
* CreateIntTblPropCollector(
122 uint32_t column_family_id
) override
{
123 TablePropertiesCollectorFactory::Context context
;
124 context
.column_family_id
= column_family_id
;
125 return new UserKeyTablePropertiesCollector(
126 user_collector_factory_
->CreateTablePropertiesCollector(context
));
129 virtual const char* Name() const override
{
130 return user_collector_factory_
->Name();
134 std::shared_ptr
<TablePropertiesCollectorFactory
> user_collector_factory_
;
137 } // namespace rocksdb