YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/util/memory/memory_usage.h
Line
Count
Source (jump to first uncovered line)
1
//
2
// Copyright (c) YugaByte, Inc.
3
//
4
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
// in compliance with the License.  You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software distributed under the License
10
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
// or implied.  See the License for the specific language governing permissions and limitations
12
// under the License.
13
//
14
//
15
16
#ifndef YB_UTIL_MEMORY_MEMORY_USAGE_H
17
#define YB_UTIL_MEMORY_MEMORY_USAGE_H
18
19
#include <string>
20
#include <type_traits>
21
22
#include <boost/container/small_vector.hpp>
23
#include <boost/core/enable_if.hpp>
24
#include <boost/type_traits.hpp>
25
26
#include <google/protobuf/message.h>
27
28
#include "yb/util/type_traits.h"
29
30
namespace yb {
31
32
// If there is DynamicMemoryUsage member or DynamicMemoryUsageOf free function for the
33
// class - use it.
34
HAS_MEMBER_FUNCTION(DynamicMemoryUsage);
35
HAS_FREE_FUNCTION(DynamicMemoryUsageOf);
36
37
template <class T>
38
typename std::enable_if<HasMemberFunction_DynamicMemoryUsage<T>::value, std::size_t>::type
39
168M
DynamicMemoryUsageOf(const T& value) {
40
168M
  return value.DynamicMemoryUsage();
41
168M
}
_ZN2yb20DynamicMemoryUsageOfINS_2ql14CQLServerEventEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS5_
Line
Count
Source
39
91.6k
DynamicMemoryUsageOf(const T& value) {
40
91.6k
  return value.DynamicMemoryUsage();
41
91.6k
}
_ZN2yb20DynamicMemoryUsageOfINS_2ql13EventResponseEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS5_
Line
Count
Source
39
91.9k
DynamicMemoryUsageOf(const T& value) {
40
91.9k
  return value.DynamicMemoryUsage();
41
91.9k
}
_ZN2yb20DynamicMemoryUsageOfINS_12RefCntBufferEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS4_
Line
Count
Source
39
44.7M
DynamicMemoryUsageOf(const T& value) {
40
44.7M
  return value.DynamicMemoryUsage();
41
44.7M
}
_ZN2yb20DynamicMemoryUsageOfINS_5SliceEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS4_
Line
Count
Source
39
377k
DynamicMemoryUsageOf(const T& value) {
40
377k
  return value.DynamicMemoryUsage();
41
377k
}
_ZN2yb20DynamicMemoryUsageOfINS_3rpc12OutboundDataEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS5_
Line
Count
Source
39
44.7M
DynamicMemoryUsageOf(const T& value) {
40
44.7M
  return value.DynamicMemoryUsage();
41
44.7M
}
_ZN2yb20DynamicMemoryUsageOfINS_3rpc8CallDataEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS5_
Line
Count
Source
39
19.5M
DynamicMemoryUsageOf(const T& value) {
40
19.5M
  return value.DynamicMemoryUsage();
41
19.5M
}
_ZN2yb20DynamicMemoryUsageOfINS_3rpc12CallResponseEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS5_
Line
Count
Source
39
19.5M
DynamicMemoryUsageOf(const T& value) {
40
19.5M
  return value.DynamicMemoryUsage();
41
19.5M
}
_ZN2yb20DynamicMemoryUsageOfINS_5TraceEEENSt3__19enable_ifIXsr36HasMemberFunction_DynamicMemoryUsageIT_EE5valueEmE4typeERKS4_
Line
Count
Source
39
39.2M
DynamicMemoryUsageOf(const T& value) {
40
39.2M
  return value.DynamicMemoryUsage();
41
39.2M
}
42
43
template <class Collection>
44
std::size_t DynamicMemoryUsageOfCollection(const Collection& collection);
45
46
template <class Int>
47
typename std::enable_if<std::is_integral<typename std::remove_reference<Int>::type>::value,
48
                        std::size_t>::type DynamicMemoryUsageOf(const Int& value) {
49
  return 0;
50
}
51
52
template <class Int>
53
typename std::enable_if<std::is_integral<typename std::remove_reference<Int>::type>::value,
54
104k
                        std::size_t>::type DynamicMemoryUsageOf(const std::atomic<Int>& value) {
55
104k
  return 0;
56
104k
}
57
58
// std::string uses internal capacity for up to kStdStringInternalSize bytes and only allocates
59
// memory from heap for bigger strings. Exact memory allocation behaviour depends on C++ std
60
// library implementation.
61
62
#if defined(__clang__)
63
64
constexpr const auto kStdStringInternalCapacity = 22;
65
66
878k
inline std::size_t DynamicMemoryUsageOf(const std::string& value) {
67
878k
  const auto capacity = value.capacity();
68
878k
  if (capacity <= kStdStringInternalCapacity) {
69
874k
    return 0;
70
3.37k
  } else {
71
    // std::string allocates 16*n bytes for capacity from [16*(n - 1); 16*n - 1].
72
    // 48 bytes for capacity in [32; 47], 64 bytes for capacity in [48; 63] and so on...
73
3.37k
    return (capacity + 16) & ~(size_t(0xf));
74
3.37k
  }
75
878k
}
76
77
#elif (__GNUC__ >= 9)
78
79
inline std::size_t DynamicMemoryUsageOf(const std::string& value) {
80
  const auto capacity = value.capacity();
81
  if (capacity == 0) {
82
    return 0;
83
  } else {
84
    return capacity + 25;
85
  }
86
}
87
88
#else
89
90
constexpr const auto kStdStringInternalCapacity = 15;
91
92
inline std::size_t DynamicMemoryUsageOf(const std::string& value) {
93
  const auto capacity = value.capacity();
94
  if (capacity <= kStdStringInternalCapacity) {
95
    return 0;
96
  } else {
97
    return capacity + 1;
98
  }
99
}
100
101
#endif // defined(__clang__)
102
103
template <class T>
104
typename boost::enable_if<boost::is_base_of<google::protobuf::Message, T>, std::size_t>::type
105
19.6M
DynamicMemoryUsageOf(const T& value) {
106
  // SpaceUsedLong() includes both dynamic memory and sizeof(Type), so we need to subtract.
107
19.6M
  return value.SpaceUsedLong() - sizeof(T);
108
19.6M
}
Unexecuted instantiation: _ZN2yb20DynamicMemoryUsageOfINS_3rpc13ErrorStatusPBEEEN5boost9enable_ifINS3_10is_base_ofIN6google8protobuf7MessageET_EEmE4typeERKS9_
_ZN2yb20DynamicMemoryUsageOfINS_15RedisResponsePBEEEN5boost9enable_ifINS2_10is_base_ofIN6google8protobuf7MessageET_EEmE4typeERKS8_
Line
Count
Source
105
104k
DynamicMemoryUsageOf(const T& value) {
106
  // SpaceUsedLong() includes both dynamic memory and sizeof(Type), so we need to subtract.
107
104k
  return value.SpaceUsedLong() - sizeof(T);
108
104k
}
_ZN2yb20DynamicMemoryUsageOfINS_3rpc14ResponseHeaderEEEN5boost9enable_ifINS3_10is_base_ofIN6google8protobuf7MessageET_EEmE4typeERKS9_
Line
Count
Source
105
19.5M
DynamicMemoryUsageOf(const T& value) {
106
  // SpaceUsedLong() includes both dynamic memory and sizeof(Type), so we need to subtract.
107
19.5M
  return value.SpaceUsedLong() - sizeof(T);
108
19.5M
}
109
110
template <class Pointer>
111
typename std::enable_if<IsPointerLike<Pointer>::value, std::size_t>::type
112
84.2M
DynamicMemoryUsageOf(const Pointer& value) {
113
84.0M
  return value ? (value->ObjectSize() + DynamicMemoryUsageOf(*value)) : 0;
114
84.2M
}
_ZN2yb20DynamicMemoryUsageOfINSt3__110unique_ptrINS_2ql14CQLServerEventENS1_14default_deleteIS4_EEEEEENS1_9enable_ifIXsr13IsPointerLikeIT_EE5valueEmE4typeERKS9_
Line
Count
Source
112
91.7k
DynamicMemoryUsageOf(const Pointer& value) {
113
91.6k
  return value ? (value->ObjectSize() + DynamicMemoryUsageOf(*value)) : 0;
114
91.7k
}
_ZN2yb20DynamicMemoryUsageOfINSt3__110unique_ptrINS_2ql13EventResponseENS1_14default_deleteIS4_EEEEEENS1_9enable_ifIXsr13IsPointerLikeIT_EE5valueEmE4typeERKS9_
Line
Count
Source
112
91.9k
DynamicMemoryUsageOf(const Pointer& value) {
113
18.4E
  return value ? (value->ObjectSize() + DynamicMemoryUsageOf(*value)) : 0;
114
91.9k
}
_ZN2yb20DynamicMemoryUsageOfINSt3__110shared_ptrINS_3rpc12OutboundDataEEEEENS1_9enable_ifIXsr13IsPointerLikeIT_EE5valueEmE4typeERKS7_
Line
Count
Source
112
44.7M
DynamicMemoryUsageOf(const Pointer& value) {
113
44.7M
  return value ? (value->ObjectSize() + DynamicMemoryUsageOf(*value)) : 0;
114
44.7M
}
_ZN2yb20DynamicMemoryUsageOfI13scoped_refptrINS_5TraceEEEENSt3__19enable_ifIXsr13IsPointerLikeIT_EE5valueEmE4typeERKS6_
Line
Count
Source
112
39.2M
DynamicMemoryUsageOf(const Pointer& value) {
113
39.1M
  return value ? (value->ObjectSize() + DynamicMemoryUsageOf(*value)) : 0;
114
39.2M
}
115
116
// Could be used instead of DynamicMemoryUsage on pointer-like objects when there is no
117
// ObjectSize() implementation in inner objects, but we already know that inner objects are of
118
// type which is used in pointer-like object definition, but not some subclasses. So we can
119
// compute size using sizeof().
120
template <class Pointer>
121
typename std::enable_if<IsPointerLike<Pointer>::value, std::size_t>::type
122
19.5M
DynamicMemoryUsageAllowSizeOf(const Pointer& value) {
123
19.5M
  return value ? (sizeof(value) + DynamicMemoryUsageOf(*value)) : 0;
124
19.5M
}
125
126
// Get dynamic memory usage by entries of small_vector, but don't take into account entries inner
127
// dynamic memory usage.
128
// This is used to calculate memory usage by small_vector of pointers pointing to data which we
129
// don't own, so this data memory usage should be tracked by owner.
130
template <class T, size_t InternalCapacity>
131
size_t GetFlatDynamicMemoryUsageOf(
132
16.8M
    const boost::container::small_vector<T, InternalCapacity>& value) {
133
16.8M
  return value.capacity() > value.internal_capacity() ? value.capacity() * sizeof(T) : 0;
134
16.8M
}
_ZN2yb27GetFlatDynamicMemoryUsageOfINS_15RedisResponsePBELm16EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
132
104k
    const boost::container::small_vector<T, InternalCapacity>& value) {
133
104k
  return value.capacity() > value.internal_capacity() ? value.capacity() * sizeof(T) : 0;
134
104k
}
_ZN2yb27GetFlatDynamicMemoryUsageOfINSt3__16atomicImEELm16EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
132
104k
    const boost::container::small_vector<T, InternalCapacity>& value) {
133
104k
  return value.capacity() > value.internal_capacity() ? value.capacity() * sizeof(T) : 0;
134
104k
}
_ZN2yb27GetFlatDynamicMemoryUsageOfIN5boost9container12small_vectorINS_5SliceELm8EvvEELm16EEEmRKNS3_IT_XT0_EvvEE
Line
Count
Source
132
104k
    const boost::container::small_vector<T, InternalCapacity>& value) {
133
104k
  return value.capacity() > value.internal_capacity() ? value.capacity() * sizeof(T) : 0;
134
104k
}
_ZN2yb27GetFlatDynamicMemoryUsageOfINS_5SliceELm8EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
132
104k
    const boost::container::small_vector<T, InternalCapacity>& value) {
133
104k
  return value.capacity() > value.internal_capacity() ? value.capacity() * sizeof(T) : 0;
134
104k
}
_ZN2yb27GetFlatDynamicMemoryUsageOfIPKhLm16EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
132
16.4M
    const boost::container::small_vector<T, InternalCapacity>& value) {
133
16.4M
  return value.capacity() > value.internal_capacity() ? value.capacity() * sizeof(T) : 0;
134
16.4M
}
135
136
template <class T, size_t InternalCapacity>
137
418k
size_t DynamicMemoryUsageOf(const boost::container::small_vector<T, InternalCapacity>& value) {
138
418k
  size_t result = GetFlatDynamicMemoryUsageOf(value);
139
691k
  for (const auto& entry : value) {
140
691k
    result += DynamicMemoryUsageOf(entry);
141
691k
  }
142
418k
  return result;
143
418k
}
_ZN2yb20DynamicMemoryUsageOfINS_15RedisResponsePBELm16EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
137
104k
size_t DynamicMemoryUsageOf(const boost::container::small_vector<T, InternalCapacity>& value) {
138
104k
  size_t result = GetFlatDynamicMemoryUsageOf(value);
139
104k
  for (const auto& entry : value) {
140
104k
    result += DynamicMemoryUsageOf(entry);
141
104k
  }
142
104k
  return result;
143
104k
}
_ZN2yb20DynamicMemoryUsageOfINSt3__16atomicImEELm16EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
137
104k
size_t DynamicMemoryUsageOf(const boost::container::small_vector<T, InternalCapacity>& value) {
138
104k
  size_t result = GetFlatDynamicMemoryUsageOf(value);
139
104k
  for (const auto& entry : value) {
140
104k
    result += DynamicMemoryUsageOf(entry);
141
104k
  }
142
104k
  return result;
143
104k
}
_ZN2yb20DynamicMemoryUsageOfIN5boost9container12small_vectorINS_5SliceELm8EvvEELm16EEEmRKNS3_IT_XT0_EvvEE
Line
Count
Source
137
104k
size_t DynamicMemoryUsageOf(const boost::container::small_vector<T, InternalCapacity>& value) {
138
104k
  size_t result = GetFlatDynamicMemoryUsageOf(value);
139
104k
  for (const auto& entry : value) {
140
104k
    result += DynamicMemoryUsageOf(entry);
141
104k
  }
142
104k
  return result;
143
104k
}
_ZN2yb20DynamicMemoryUsageOfINS_5SliceELm8EEEmRKN5boost9container12small_vectorIT_XT0_EvvEE
Line
Count
Source
137
104k
size_t DynamicMemoryUsageOf(const boost::container::small_vector<T, InternalCapacity>& value) {
138
104k
  size_t result = GetFlatDynamicMemoryUsageOf(value);
139
377k
  for (const auto& entry : value) {
140
377k
    result += DynamicMemoryUsageOf(entry);
141
377k
  }
142
104k
  return result;
143
104k
}
144
145
template <class T>
146
typename std::enable_if<IsCollection<T>::value, std::size_t>::type
147
19.1k
DynamicMemoryUsageOf(const T& value) {
148
19.1k
  return DynamicMemoryUsageOfCollection(value);
149
19.1k
}
Unexecuted instantiation: _ZN2yb20DynamicMemoryUsageOfINSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEEEENS1_9enable_ifIXsr12IsCollectionIT_EE5valueEmE4typeERKSC_
_ZN2yb20DynamicMemoryUsageOfINSt3__16vectorINS1_10unique_ptrINS_2ql14CQLServerEventENS1_14default_deleteIS5_EEEENS1_9allocatorIS8_EEEEEENS1_9enable_ifIXsr12IsCollectionIT_EE5valueEmE4typeERKSD_
Line
Count
Source
147
19.1k
DynamicMemoryUsageOf(const T& value) {
148
19.1k
  return DynamicMemoryUsageOfCollection(value);
149
19.1k
}
150
151
template <class Collection>
152
19.0k
std::size_t DynamicMemoryUsageOfCollection(const Collection& collection) {
153
19.0k
  std::size_t result = collection.capacity() * sizeof(typename Collection::value_type);
154
91.8k
  for (const auto& item : collection) {
155
91.8k
    result += DynamicMemoryUsageOf(item);
156
91.8k
  }
157
19.0k
  return result;
158
19.0k
}
Unexecuted instantiation: _ZN2yb30DynamicMemoryUsageOfCollectionINSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEEEEmRKT_
_ZN2yb30DynamicMemoryUsageOfCollectionINSt3__16vectorINS1_10unique_ptrINS_2ql14CQLServerEventENS1_14default_deleteIS5_EEEENS1_9allocatorIS8_EEEEEEmRKT_
Line
Count
Source
152
19.0k
std::size_t DynamicMemoryUsageOfCollection(const Collection& collection) {
153
19.0k
  std::size_t result = collection.capacity() * sizeof(typename Collection::value_type);
154
91.8k
  for (const auto& item : collection) {
155
91.8k
    result += DynamicMemoryUsageOf(item);
156
91.8k
  }
157
19.0k
  return result;
158
19.0k
}
159
160
template <typename T, typename... Types>
161
59.7M
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
59.7M
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
59.7M
}
Unexecuted instantiation: _ZN2yb20DynamicMemoryUsageOfINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEJS7_S7_S7_NS1_6vectorIS7_NS5_IS7_EEEEEEEmRKT_DpRKT0_
Unexecuted instantiation: _ZN2yb20DynamicMemoryUsageOfINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEJS7_S7_NS1_6vectorIS7_NS5_IS7_EEEEEEEmRKT_DpRKT0_
Unexecuted instantiation: _ZN2yb20DynamicMemoryUsageOfINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEJS7_NS1_6vectorIS7_NS5_IS7_EEEEEEEmRKT_DpRKT0_
Unexecuted instantiation: _ZN2yb20DynamicMemoryUsageOfINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEJNS1_6vectorIS7_NS5_IS7_EEEEEEEmRKT_DpRKT0_
_ZN2yb20DynamicMemoryUsageOfINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEJNS_12RefCntBufferEEEEmRKT_DpRKT0_
Line
Count
Source
161
786k
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
786k
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
786k
}
_ZN2yb20DynamicMemoryUsageOfIN5boost9container12small_vectorINS_15RedisResponsePBELm16EvvEEJNS3_INSt3__16atomicImEELm16EvvEENS3_INS3_INS_5SliceELm8EvvEELm16EvvEEEEEmRKT_DpRKT0_
Line
Count
Source
161
104k
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
104k
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
104k
}
_ZN2yb20DynamicMemoryUsageOfIN5boost9container12small_vectorINSt3__16atomicImEELm16EvvEEJNS3_INS3_INS_5SliceELm8EvvEELm16EvvEEEEEmRKT_DpRKT0_
Line
Count
Source
161
104k
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
104k
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
104k
}
_ZN2yb20DynamicMemoryUsageOfINS_12RefCntBufferEJNSt3__110shared_ptrINS_3rpc12OutboundDataEEEEEEmRKT_DpRKT0_
Line
Count
Source
161
112k
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
112k
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
112k
}
_ZN2yb20DynamicMemoryUsageOfINS_3rpc14ResponseHeaderEJNS1_8CallDataEEEEmRKT_DpRKT0_
Line
Count
Source
161
19.5M
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
19.5M
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
19.5M
}
_ZN2yb20DynamicMemoryUsageOfINS_12RefCntBufferEJNS_3rpc12CallResponseE13scoped_refptrINS_5TraceEEEEEmRKT_DpRKT0_
Line
Count
Source
161
19.5M
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
19.5M
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
19.5M
}
_ZN2yb20DynamicMemoryUsageOfINS_3rpc12CallResponseEJ13scoped_refptrINS_5TraceEEEEEmRKT_DpRKT0_
Line
Count
Source
161
19.5M
std::size_t DynamicMemoryUsageOf(const T& entity, const Types&... rest_entities) {
162
19.5M
  return DynamicMemoryUsageOf(entity) + DynamicMemoryUsageOf(rest_entities...);
163
19.5M
}
164
165
}  // namespace yb
166
167
#endif  // YB_UTIL_MEMORY_MEMORY_USAGE_H