mirror of
https://github.com/XRPLF/rippled.git
synced 2026-09-27 15:28:03 +00:00
fix(telemetry): make the consensus trace strategy an enum
consensus_trace_strategy was read as a std::string and compared against the literal "attribute" in startRoundTracing(), while the runbook documented "deterministic" and "random". The documented value "random" therefore fell through to the default and did nothing. Parse the setting once into ConsensusTraceStrategy, so the consensus code branches on a type. The accepted spellings are now "deterministic" and "random"; anything else fails at startup instead of silently defaulting. The behaviour behind the old "attribute" name is unchanged and is now reached by "random". Document consensus_trace_strategy in xrpld-example.cfg, stating that "random" is experimental and not used: it gives each node its own trace id, so one round arrives as one trace per node. Also state on the tx.included event that it covers the agreed consensus set before the ledger is built, so it is a superset of the accepted ledger.
This commit is contained in:
@@ -46,6 +46,7 @@ constexpr char const* traceConsensus = "trace_consensus";
|
||||
constexpr char const* traceRpc = "trace_rpc";
|
||||
constexpr char const* tracePeer = "trace_peer";
|
||||
constexpr char const* traceLedger = "trace_ledger";
|
||||
constexpr char const* consensusTraceStrategy = "consensus_trace_strategy";
|
||||
} // namespace key
|
||||
|
||||
/**
|
||||
@@ -150,6 +151,33 @@ networkTypeFromId(std::uint32_t networkId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Map a `consensus_trace_strategy` value onto its enumerator.
|
||||
*
|
||||
* Only the two documented spellings are accepted. A typo would otherwise pick
|
||||
* the default silently, and the operator would never learn the setting had no
|
||||
* effect. Matching is exact and case-sensitive, like every other value in this
|
||||
* section.
|
||||
*
|
||||
* @param value Raw config value; empty means the key was absent.
|
||||
* @return The matching strategy, or Deterministic when the key was absent.
|
||||
* @throws std::runtime_error If the value is neither documented spelling.
|
||||
*/
|
||||
[[nodiscard]] ConsensusTraceStrategy
|
||||
readConsensusTraceStrategy(std::string const& value)
|
||||
{
|
||||
if (value.empty() || value == strategyName(ConsensusTraceStrategy::Deterministic))
|
||||
return ConsensusTraceStrategy::Deterministic;
|
||||
|
||||
if (value == strategyName(ConsensusTraceStrategy::Random))
|
||||
return ConsensusTraceStrategy::Random;
|
||||
|
||||
Throw<std::runtime_error>(
|
||||
std::string("Invalid value '") + key::consensusTraceStrategy + "' in " + kSectionLabel +
|
||||
": must be '" + strategyName(ConsensusTraceStrategy::Deterministic) + "' or '" +
|
||||
strategyName(ConsensusTraceStrategy::Random) + "'.");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Telemetry::Setup
|
||||
@@ -204,7 +232,7 @@ makeTelemetrySetup(
|
||||
setup.traceLedger = section.valueOr<int>(key::traceLedger, 1) != 0;
|
||||
|
||||
setup.consensusTraceStrategy =
|
||||
section.valueOr<std::string>("consensus_trace_strategy", "deterministic");
|
||||
readConsensusTraceStrategy(section.valueOr<std::string>(key::consensusTraceStrategy, ""));
|
||||
|
||||
return setup;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user