mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-21 14:20:56 +00:00
fix: Report telemetry config errors instead of aborting at startup
makeTelemetrySetup() rejects a contradictory [telemetry] mutual-TLS setup by throwing, but it is called from ApplicationImp's member-initializer list. A try/catch in the constructor body cannot reach a throw from there, and nothing further up the stack caught it either, so a config mistake reached std::terminate: the default handler printed a terminate dump and raised SIGABRT, leaving a core file instead of a startup error. Catch std::exception around makeApplication() in run(), report the reason on stderr and return -1, so the failure is a clean non-zero exit with a message an operator can act on. Only the construction is wrapped. setup() starts subsystems whose shutdown order is delicate and is left outside deliberately, because unwinding a half-started Application would skip the normal stop sequence. Gate both validation guards on enabled. A node with telemetry switched off previously refused to start over certificate paths that nothing would read. Document both throws on makeTelemetrySetup(), state in cfg/xrpld-example.cfg and the configuration reference that a partial mutual-TLS setup is fatal and that the checks apply only when enabled=1, and add a runbook troubleshooting entry keyed on the two error messages. Tests cover both guards with the message asserted so the two are told apart, both enabled=0 paths, and the default plaintext configuration.
This commit is contained in:
@@ -409,8 +409,10 @@ public:
|
||||
/**
|
||||
* Create a Telemetry instance.
|
||||
*
|
||||
* Returns a TelemetryImpl when setup.enabled is true, or a
|
||||
* NullTelemetry no-op stub otherwise.
|
||||
* With XRPL_ENABLE_TELEMETRY defined, returns a TelemetryImpl when
|
||||
* setup.enabled is true, or a no-op stub otherwise. Without it, the only
|
||||
* definition of this factory always returns the no-op stub and never reads
|
||||
* setup.enabled.
|
||||
*
|
||||
* @param setup Configuration from the [telemetry] config section.
|
||||
* @param journal Journal for log output during initialization.
|
||||
@@ -427,6 +429,14 @@ makeTelemetry(Telemetry::Setup const& setup, beast::Journal journal);
|
||||
* @param networkId Network identifier from [network_id] config
|
||||
* (0 = mainnet, 1 = testnet, 2 = devnet).
|
||||
* @return A populated Setup struct with defaults for missing values.
|
||||
* @throws std::runtime_error If `enabled` is set and the mutual TLS (mTLS)
|
||||
* settings contradict each other: only one of `tls_client_cert`/`tls_client_key`
|
||||
* is given, or a client certificate is given while `use_tls` is 0. Those two
|
||||
* checks are skipped when `enabled` is 0.
|
||||
* @throws boost::bad_lexical_cast If any numeric key (`enabled`, `use_tls`,
|
||||
* `batch_size`, the trace switches, ...) holds a value Section::valueOr cannot
|
||||
* convert. None of the numeric reads sit inside the `enabled` branch, so this
|
||||
* escapes whether telemetry is on or off.
|
||||
*/
|
||||
Telemetry::Setup
|
||||
makeTelemetrySetup(
|
||||
|
||||
Reference in New Issue
Block a user