mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-14 09:58:50 +08:00
TDMetric optimizations
This commit is contained in:
parent
e7e53aeb98
commit
21d7620922
@ -97,9 +97,7 @@ struct KeyWithWriter {
|
||||
KeyWithWriter( KeyWithWriter&& r ) : key(std::move(r.key)), writer(std::move(r.writer)), writerOffset(r.writerOffset) {}
|
||||
void operator=( KeyWithWriter&& r ) { key = std::move(r.key); writer = std::move(r.writer); writerOffset = r.writerOffset; }
|
||||
|
||||
StringRef value() {
|
||||
return StringRef(writer.toValue().substr(writerOffset));
|
||||
}
|
||||
StringRef value() const { return StringRef(writer.toValue().substr(writerOffset)); }
|
||||
};
|
||||
|
||||
// This is a very minimal interface for getting metric data from the DB which is needed
|
||||
@ -238,7 +236,7 @@ struct MetricData {
|
||||
start = r.start; rollTime = r.rollTime; appendStart = r.appendStart; writer = std::move(r.writer);
|
||||
}
|
||||
|
||||
std::string toString();
|
||||
std::string toString() const;
|
||||
};
|
||||
|
||||
// Some common methods to reduce code redundancy across different metric definitions
|
||||
@ -452,12 +450,12 @@ struct FieldValueBlockEncoding<Standalone<StringRef>> {
|
||||
|
||||
// Field level for value type of T using header type of Header. Default header type is the default FieldHeader implementation for type T.
|
||||
template <class T, class Header = FieldHeader<T>, class Encoder = FieldValueBlockEncoding<T>>
|
||||
struct FieldLevel {
|
||||
|
||||
Deque<MetricData> metrics;
|
||||
class FieldLevel {
|
||||
int64_t appendUsed;
|
||||
Deque<MetricData> metrics;
|
||||
Header header;
|
||||
|
||||
public:
|
||||
// The previous header and the last timestamp at which an out going MetricData block requires header patching
|
||||
Optional<Header> previousHeader;
|
||||
uint64_t lastTimeRequiringHeaderPatch;
|
||||
@ -465,15 +463,10 @@ struct FieldLevel {
|
||||
Encoder enc;
|
||||
|
||||
explicit FieldLevel() : appendUsed(0) {
|
||||
metrics.emplace_back(MetricData());
|
||||
metrics.emplace_back();
|
||||
metrics.back().writer << header;
|
||||
}
|
||||
|
||||
FieldLevel(FieldLevel &&f)
|
||||
: metrics(std::move(f.metrics)), appendUsed(f.appendUsed), enc(f.enc), header(f.header),
|
||||
previousHeader(f.previousHeader), lastTimeRequiringHeaderPatch(f.lastTimeRequiringHeaderPatch) {
|
||||
}
|
||||
|
||||
// update Header, use Encoder to write T v
|
||||
void log( T v, uint64_t t, bool& overflow, int64_t& bytes ) {
|
||||
int lastLength = metrics.back().writer.getLength();
|
||||
@ -504,7 +497,7 @@ struct FieldLevel {
|
||||
}
|
||||
|
||||
metrics.back().rollTime = t;
|
||||
metrics.emplace_back(MetricData());
|
||||
metrics.emplace_back();
|
||||
metrics.back().writer << header;
|
||||
enc = Encoder();
|
||||
appendUsed = 0;
|
||||
@ -517,9 +510,9 @@ struct FieldLevel {
|
||||
metrics.back().rollTime = t;
|
||||
appendUsed += metrics.back().writer.getLength();
|
||||
if(metrics.back().appendStart)
|
||||
metrics.emplace_back(MetricData(metrics.back().appendStart));
|
||||
metrics.emplace_back(metrics.back().appendStart);
|
||||
else
|
||||
metrics.emplace_back(MetricData(metrics.back().start));
|
||||
metrics.emplace_back(metrics.back().start);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -211,6 +211,6 @@ void DynamicEventMetric::registerFields(MetricKeyRef const &mk, std::vector<Stan
|
||||
fieldsToRegister.clear();
|
||||
}
|
||||
|
||||
std::string MetricData::toString() {
|
||||
std::string MetricData::toString() const {
|
||||
return format("MetricData(addr=%p start=%llu appendStart=%llu rollTime=%llu writerLen=%d)", this, start, appendStart, rollTime, writer.getLength());
|
||||
}
|
||||
|
@ -346,14 +346,14 @@ public:
|
||||
*(T*)writeBytes(sizeof(T)) = t;
|
||||
}
|
||||
void* getData() { return data; }
|
||||
int getLength() { return size; }
|
||||
Standalone<StringRef> toValue() { return Standalone<StringRef>( StringRef(data,size), arena ); }
|
||||
int getLength() const { return size; }
|
||||
Standalone<StringRef> toValue() const { return Standalone<StringRef>(StringRef(data, size), arena); }
|
||||
template <class VersionOptions>
|
||||
explicit BinaryWriter( VersionOptions vo ) : data(nullptr), size(0), allocated(0) { vo.write(*this); }
|
||||
BinaryWriter( BinaryWriter&& rhs ) : arena(std::move(rhs.arena)), data(rhs.data), size(rhs.size), allocated(rhs.allocated), m_protocolVersion(rhs.m_protocolVersion) {
|
||||
rhs.size = 0;
|
||||
rhs.allocated = 0;
|
||||
rhs.data = 0;
|
||||
rhs.data = nullptr;
|
||||
}
|
||||
void operator=( BinaryWriter&& r) {
|
||||
arena = std::move(r.arena);
|
||||
@ -363,7 +363,7 @@ public:
|
||||
m_protocolVersion = r.m_protocolVersion;
|
||||
r.size = 0;
|
||||
r.allocated = 0;
|
||||
r.data = 0;
|
||||
r.data = nullptr;
|
||||
}
|
||||
|
||||
template <class T, class VersionOptions>
|
||||
|
Loading…
x
Reference in New Issue
Block a user