TDMetric optimizations

This commit is contained in:
sfc-gh-tclinkenbeard 2020-12-26 22:35:28 -04:00
parent e7e53aeb98
commit 21d7620922
3 changed files with 14 additions and 21 deletions

View File

@ -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);
}
}

View File

@ -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());
}

View File

@ -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>