blob: 87d2da9d355737beab243e2dd34cd70fd75ebfeb (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "memory_bounded_trace.h"
#include <vespa/vespalib/util/stringfmt.h>
namespace storage {
MemoryBoundedTrace::MemoryBoundedTrace(size_t softMemoryUpperBound)
: _trace(),
_currentMemoryUsed(0),
_omittedNodes(0),
_omittedBytes(0),
_softMemoryUpperBound(softMemoryUpperBound)
{
}
bool
MemoryBoundedTrace::add(const mbus::TraceNode& node)
{
const size_t nodeFootprint = node.computeMemoryUsage();
if (_currentMemoryUsed >= _softMemoryUpperBound) {
++_omittedNodes;
_omittedBytes += nodeFootprint;
return false;
}
_trace.addChild(vespalib::TraceNode(node));
_currentMemoryUsed += nodeFootprint;
return true;
}
bool
MemoryBoundedTrace::add(mbus::Trace && node)
{
const size_t nodeFootprint = node.computeMemoryUsage();
if (_currentMemoryUsed >= _softMemoryUpperBound) {
++_omittedNodes;
_omittedBytes += nodeFootprint;
return false;
}
_trace.addChild(std::move(node));
_currentMemoryUsed += nodeFootprint;
return true;
}
void
MemoryBoundedTrace::moveTraceTo(mbus::Trace& out)
{
if (_trace.isEmpty()) {
return;
}
if (_omittedNodes > 0) {
_trace.trace(0, vespalib::make_string(
"Trace too large; omitted %zu subsequent trace trees "
"containing a total of %zu bytes",
_omittedNodes, _omittedBytes), false);
}
out.addChild(std::move(_trace));
_currentMemoryUsed = 0;
_omittedNodes = 0;
_omittedBytes = 0;
}
} // storage
|