Skip to content

Commit

Permalink
OpenTelemetry Tracing Perf Fixes (apple#6990)
Browse files Browse the repository at this point in the history
  • Loading branch information
sfc-gh-rjenkins authored May 2, 2022
1 parent 8284ec5 commit dc9e782
Show file tree
Hide file tree
Showing 51 changed files with 582 additions and 547 deletions.
23 changes: 15 additions & 8 deletions bindings/c/test/unit/unit_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
#include "fdbclient/Tuple.h"

#include "flow/config.h"
#include "flow/DeterministicRandom.h"
#include "flow/IRandom.h"

#include "fdb_api.hpp"

Expand Down Expand Up @@ -2021,15 +2023,17 @@ TEST_CASE("fdb_transaction_add_conflict_range") {
TEST_CASE("special-key-space valid transaction ID") {
auto value = get_value("\xff\xff/tracing/transaction_id", /* snapshot */ false, {});
REQUIRE(value.has_value());
uint64_t transaction_id = std::stoul(value.value());
CHECK(transaction_id > 0);
UID transaction_id = UID::fromString(value.value());
CHECK(transaction_id.first() > 0);
CHECK(transaction_id.second() > 0);
}

TEST_CASE("special-key-space custom transaction ID") {
fdb::Transaction tr(db);
fdb_check(tr.set_option(FDB_TR_OPTION_SPECIAL_KEY_SPACE_ENABLE_WRITES, nullptr, 0));
while (1) {
tr.set("\xff\xff/tracing/transaction_id", std::to_string(ULONG_MAX));
UID randomTransactionID = UID(deterministicRandom()->randomUInt64(), deterministicRandom()->randomUInt64());
tr.set("\xff\xff/tracing/transaction_id", randomTransactionID.toString());
fdb::ValueFuture f1 = tr.get("\xff\xff/tracing/transaction_id",
/* snapshot */ false);

Expand All @@ -2046,8 +2050,8 @@ TEST_CASE("special-key-space custom transaction ID") {
fdb_check(f1.get(&out_present, (const uint8_t**)&val, &vallen));

REQUIRE(out_present);
uint64_t transaction_id = std::stoul(std::string(val, vallen));
CHECK(transaction_id == ULONG_MAX);
UID transaction_id = UID::fromString(val);
CHECK(transaction_id == randomTransactionID);
break;
}
}
Expand All @@ -2074,8 +2078,9 @@ TEST_CASE("special-key-space set transaction ID after write") {
fdb_check(f1.get(&out_present, (const uint8_t**)&val, &vallen));

REQUIRE(out_present);
uint64_t transaction_id = std::stoul(std::string(val, vallen));
CHECK(transaction_id != 0);
UID transaction_id = UID::fromString(val);
CHECK(transaction_id.first() > 0);
CHECK(transaction_id.second() > 0);
break;
}
}
Expand Down Expand Up @@ -2140,7 +2145,9 @@ TEST_CASE("special-key-space tracing get range") {
CHECK(out_count == 2);

CHECK(std::string((char*)out_kv[1].key, out_kv[1].key_length) == tracingBegin + "transaction_id");
CHECK(std::stoul(std::string((char*)out_kv[1].value, out_kv[1].value_length)) > 0);
UID transaction_id = UID::fromString(std::string((char*)out_kv[1].value));
CHECK(transaction_id.first() > 0);
CHECK(transaction_id.second() > 0);
break;
}
}
Expand Down
18 changes: 9 additions & 9 deletions fdbclient/CommitProxyInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ struct CommitTransactionRequest : TimedRequest {
bool firstInBatch() const { return (flags & FLAG_FIRST_IN_BATCH) != 0; }

Arena arena;
SpanID spanContext;
SpanContext spanContext;
CommitTransactionRef transaction;
ReplyPromise<CommitID> reply;
uint32_t flags;
Expand All @@ -172,8 +172,8 @@ struct CommitTransactionRequest : TimedRequest {

TenantInfo tenantInfo;

CommitTransactionRequest() : CommitTransactionRequest(SpanID()) {}
CommitTransactionRequest(SpanID const& context) : spanContext(context), flags(0) {}
CommitTransactionRequest() : CommitTransactionRequest(SpanContext()) {}
CommitTransactionRequest(SpanContext const& context) : spanContext(context), flags(0) {}

template <class Ar>
void serialize(Ar& ar) {
Expand Down Expand Up @@ -242,7 +242,7 @@ struct GetReadVersionRequest : TimedRequest {
FLAG_PRIORITY_MASK = PRIORITY_SYSTEM_IMMEDIATE,
};

SpanID spanContext;
SpanContext spanContext;
uint32_t transactionCount;
uint32_t flags;
TransactionPriority priority;
Expand All @@ -255,7 +255,7 @@ struct GetReadVersionRequest : TimedRequest {
Version maxVersion; // max version in the client's version vector cache

GetReadVersionRequest() : transactionCount(1), flags(0), maxVersion(invalidVersion) {}
GetReadVersionRequest(SpanID spanContext,
GetReadVersionRequest(SpanContext spanContext,
uint32_t transactionCount,
TransactionPriority priority,
Version maxVersion,
Expand Down Expand Up @@ -325,7 +325,7 @@ struct GetKeyServerLocationsReply {
struct GetKeyServerLocationsRequest {
constexpr static FileIdentifier file_identifier = 9144680;
Arena arena;
SpanID spanContext;
SpanContext spanContext;
Optional<TenantNameRef> tenant;
KeyRef begin;
Optional<KeyRef> end;
Expand All @@ -340,7 +340,7 @@ struct GetKeyServerLocationsRequest {
Version minTenantVersion;

GetKeyServerLocationsRequest() : limit(0), reverse(false), minTenantVersion(latestVersion) {}
GetKeyServerLocationsRequest(SpanID spanContext,
GetKeyServerLocationsRequest(SpanContext spanContext,
Optional<TenantNameRef> const& tenant,
KeyRef const& begin,
Optional<KeyRef> const& end,
Expand Down Expand Up @@ -378,12 +378,12 @@ struct GetRawCommittedVersionReply {

struct GetRawCommittedVersionRequest {
constexpr static FileIdentifier file_identifier = 12954034;
SpanID spanContext;
SpanContext spanContext;
Optional<UID> debugID;
ReplyPromise<GetRawCommittedVersionReply> reply;
Version maxVersion; // max version in the grv proxy's version vector cache

explicit GetRawCommittedVersionRequest(SpanID spanContext,
explicit GetRawCommittedVersionRequest(SpanContext spanContext,
Optional<UID> const& debugID = Optional<UID>(),
Version maxVersion = invalidVersion)
: spanContext(spanContext), debugID(debugID), maxVersion(maxVersion) {}
Expand Down
4 changes: 3 additions & 1 deletion fdbclient/CommitTransaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#include "fdbclient/FDBTypes.h"
#include "fdbclient/Knobs.h"
#include "flow/Tracing.h"

// The versioned message has wire format : -1, version, messages
static const int32_t VERSION_HEADER = -1;
Expand Down Expand Up @@ -77,6 +78,7 @@ struct MutationRef {
AndV2,
CompareAndClear,
Reserved_For_SpanContextMessage /* See fdbserver/SpanContextMessage.h */,
Reserved_For_OTELSpanContextMessage,
MAX_ATOMIC_OP
};
// This is stored this way for serialization purposes.
Expand Down Expand Up @@ -190,7 +192,7 @@ struct CommitTransactionRef {
Version read_snapshot = 0;
bool report_conflicting_keys = false;
bool lock_aware = false; // set when metadata mutations are present
Optional<SpanID> spanContext;
Optional<SpanContext> spanContext;

template <class Ar>
force_inline void serialize(Ar& ar) {
Expand Down
10 changes: 5 additions & 5 deletions fdbclient/DatabaseContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ struct WatchParameters : public ReferenceCounted<WatchParameters> {

const Version version;
const TagSet tags;
const SpanID spanID;
const SpanContext spanContext;
const TaskPriority taskID;
const Optional<UID> debugID;
const UseProvisionalProxies useProvisionalProxies;
Expand All @@ -151,11 +151,11 @@ struct WatchParameters : public ReferenceCounted<WatchParameters> {
Optional<Value> value,
Version version,
TagSet tags,
SpanID spanID,
SpanContext spanContext,
TaskPriority taskID,
Optional<UID> debugID,
UseProvisionalProxies useProvisionalProxies)
: tenant(tenant), key(key), value(value), version(version), tags(tags), spanID(spanID), taskID(taskID),
: tenant(tenant), key(key), value(value), version(version), tags(tags), spanContext(spanContext), taskID(taskID),
debugID(debugID), useProvisionalProxies(useProvisionalProxies) {}
};

Expand Down Expand Up @@ -416,12 +416,12 @@ class DatabaseContext : public ReferenceCounted<DatabaseContext>, public FastAll
Optional<TenantName> defaultTenant;

struct VersionRequest {
SpanID spanContext;
SpanContext spanContext;
Promise<GetReadVersionReply> reply;
TagSet tags;
Optional<UID> debugID;

VersionRequest(SpanID spanContext, TagSet tags = TagSet(), Optional<UID> debugID = Optional<UID>())
VersionRequest(SpanContext spanContext, TagSet tags = TagSet(), Optional<UID> debugID = Optional<UID>())
: spanContext(spanContext), tags(tags), debugID(debugID) {}
};

Expand Down
20 changes: 0 additions & 20 deletions fdbclient/FDBTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,30 +29,10 @@
#include <unordered_set>
#include <boost/functional/hash.hpp>

#include "flow/Arena.h"
#include "flow/FastRef.h"
#include "flow/ProtocolVersion.h"
#include "flow/flow.h"

enum class TraceFlags : uint8_t { unsampled = 0b00000000, sampled = 0b00000001 };

inline TraceFlags operator&(TraceFlags lhs, TraceFlags rhs) {
return static_cast<TraceFlags>(static_cast<std::underlying_type_t<TraceFlags>>(lhs) &
static_cast<std::underlying_type_t<TraceFlags>>(rhs));
}

struct SpanContext {
UID traceID;
uint64_t spanID;
TraceFlags m_Flags;
SpanContext() : traceID(UID()), spanID(0), m_Flags(TraceFlags::unsampled) {}
SpanContext(UID traceID, uint64_t spanID, TraceFlags flags) : traceID(traceID), spanID(spanID), m_Flags(flags) {}
SpanContext(UID traceID, uint64_t spanID) : traceID(traceID), spanID(spanID), m_Flags(TraceFlags::unsampled) {}
SpanContext(Arena arena, const SpanContext& span)
: traceID(span.traceID), spanID(span.spanID), m_Flags(span.m_Flags) {}
bool isSampled() const { return (m_Flags & TraceFlags::sampled) == TraceFlags::sampled; }
};

typedef int64_t Version;
typedef uint64_t LogEpoch;
typedef uint64_t Sequence;
Expand Down
5 changes: 3 additions & 2 deletions fdbclient/IClientApi.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "fdbclient/FDBTypes.h"
#include "fdbclient/Tenant.h"

#include "flow/Tracing.h"
#include "flow/ThreadHelper.actor.h"

struct VersionVector;
Expand Down Expand Up @@ -96,11 +97,11 @@ class ITransaction {

virtual ThreadFuture<Void> commit() = 0;
virtual Version getCommittedVersion() = 0;
// @todo This API and the "getSpanID()" API may help with debugging simulation
// @todo This API and the "getSpanContext()" API may help with debugging simulation
// test failures. (These APIs are not currently invoked anywhere.) Remove them
// later if they are not really needed.
virtual VersionVector getVersionVector() = 0;
virtual UID getSpanID() = 0;
virtual SpanContext getSpanContext() = 0;
virtual ThreadFuture<int64_t> getApproximateSize() = 0;

virtual void setOption(FDBTransactionOptions::Option option, Optional<StringRef> value = Optional<StringRef>()) = 0;
Expand Down
2 changes: 1 addition & 1 deletion fdbclient/IConfigTransaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class IConfigTransaction : public ISingleThreadTransaction {
// Not implemented:
void setVersion(Version) override { throw client_invalid_operation(); }
VersionVector getVersionVector() const override { throw client_invalid_operation(); }
UID getSpanID() const override { throw client_invalid_operation(); }
SpanContext getSpanContext() const override { throw client_invalid_operation(); }
Future<Key> getKey(KeySelector const& key, Snapshot snapshot = Snapshot::False) override {
throw client_invalid_operation();
}
Expand Down
2 changes: 1 addition & 1 deletion fdbclient/ISingleThreadTransaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class ISingleThreadTransaction : public ReferenceCounted<ISingleThreadTransactio
virtual Future<Void> commit() = 0;
virtual Version getCommittedVersion() const = 0;
virtual VersionVector getVersionVector() const = 0;
virtual UID getSpanID() const = 0;
virtual SpanContext getSpanContext() const = 0;
virtual int64_t getApproximateSize() const = 0;
virtual Future<Standalone<StringRef>> getVersionstamp() = 0;
virtual void setOption(FDBTransactionOptions::Option option, Optional<StringRef> value = Optional<StringRef>()) = 0;
Expand Down
6 changes: 3 additions & 3 deletions fdbclient/MultiVersionTransaction.actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1105,13 +1105,13 @@ VersionVector MultiVersionTransaction::getVersionVector() {
return VersionVector();
}

UID MultiVersionTransaction::getSpanID() {
SpanContext MultiVersionTransaction::getSpanContext() {
auto tr = getTransaction();
if (tr.transaction) {
return tr.transaction->getSpanID();
return tr.transaction->getSpanContext();
}

return UID();
return SpanContext();
}

ThreadFuture<int64_t> MultiVersionTransaction::getApproximateSize() {
Expand Down
4 changes: 2 additions & 2 deletions fdbclient/MultiVersionTransaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ class DLTransaction : public ITransaction, ThreadSafeReferenceCounted<DLTransact
ThreadFuture<Void> commit() override;
Version getCommittedVersion() override;
VersionVector getVersionVector() override;
UID getSpanID() override { return UID(); };
SpanContext getSpanContext() override { return SpanContext(); };
ThreadFuture<int64_t> getApproximateSize() override;

void setOption(FDBTransactionOptions::Option option, Optional<StringRef> value = Optional<StringRef>()) override;
Expand Down Expand Up @@ -567,7 +567,7 @@ class MultiVersionTransaction : public ITransaction, ThreadSafeReferenceCounted<
ThreadFuture<Void> commit() override;
Version getCommittedVersion() override;
VersionVector getVersionVector() override;
UID getSpanID() override;
SpanContext getSpanContext() override;
ThreadFuture<int64_t> getApproximateSize() override;

void setOption(FDBTransactionOptions::Option option, Optional<StringRef> value = Optional<StringRef>()) override;
Expand Down
Loading

0 comments on commit dc9e782

Please sign in to comment.