mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-22 14:50:54 +00:00
Drops nodestore_read_us and everything added to reach it. read_mean_us already carries microsecond precision and separated the two sync failure modes cleanly in live testing -- 8.8 us on a clean store against a 223 us cold-store peak -- so the distribution added no signal that changed a diagnosis. The cost of getting it was disproportionate. NodeStoreScheduler had no path to the metrics registry, so its production constructor grew a ServiceRegistry parameter: a metric addition changing a production signature. That in turn forced an edit to a pre-existing test, src/test/app/SHAMapStore_test.cpp, whose only stake in this is that it constructs a scheduler. Worse, the scheduler is built in Application's member initializer list, long before metricsRegistry_ exists, so the registry could not be captured once and had to be re-resolved on every fetch -- a lookup on a path that runs millions of times per sync. The constructor returns to taking JobQueue& alone and SHAMapStore_test.cpp returns to the single-argument call, leaving that file differing from its pre-change form only by the NodeStore:: to node_store:: rename it picked up from develop. FetchReport::elapsed stays microseconds and onFetch keeps its explicit duration_cast to milliseconds for addLoadEvents, which takes milliseconds. That widening was a separate fix and is what makes read latency measurable at all. kSubMillisecondBoundaries loses its only consumer and regains [[maybe_unused]], which is the state the commit that introduced it left it in; without the attribute an unused constant is an error under wextra with werr. Also removes the ledger-data-sync panel that charted the histogram and the fetch_type and found template variables, which filtered on labels no metric emits any more, plus the runbook and reference-doc sections and the two instrument and view counts that named it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
56 lines
1.5 KiB
C++
56 lines
1.5 KiB
C++
#include <xrpld/app/main/NodeStoreScheduler.h>
|
|
|
|
#include <xrpl/core/Job.h>
|
|
#include <xrpl/core/JobQueue.h>
|
|
#include <xrpl/nodestore/Scheduler.h>
|
|
#include <xrpl/nodestore/Task.h>
|
|
|
|
#include <chrono>
|
|
|
|
namespace xrpl {
|
|
|
|
NodeStoreScheduler::NodeStoreScheduler(JobQueue& jobQueue) : jobQueue_(jobQueue)
|
|
{
|
|
}
|
|
|
|
void
|
|
NodeStoreScheduler::scheduleTask(node_store::Task& task)
|
|
{
|
|
if (jobQueue_.isStopped())
|
|
return;
|
|
|
|
if (!jobQueue_.addJob(JtWrite, "NObjStore", [&task]() { task.performScheduledTask(); }))
|
|
{
|
|
// Job not added, presumably because we're shutting down.
|
|
// Recover by executing the task synchronously.
|
|
task.performScheduledTask();
|
|
}
|
|
}
|
|
|
|
void
|
|
NodeStoreScheduler::onFetch(node_store::FetchReport const& report)
|
|
{
|
|
if (jobQueue_.isStopped())
|
|
return;
|
|
|
|
// The report is in microseconds but addLoadEvents takes milliseconds, so
|
|
// cast explicitly. The load monitor only tracks whole-millisecond load,
|
|
// so the sub-millisecond detail is deliberately dropped here; telemetry
|
|
// reads the microsecond value from the nodestore instead.
|
|
jobQueue_.addLoadEvents(
|
|
report.fetchType == node_store::FetchType::Async ? JtNsAsyncRead : JtNsSyncRead,
|
|
1,
|
|
std::chrono::duration_cast<std::chrono::milliseconds>(report.elapsed));
|
|
}
|
|
|
|
void
|
|
NodeStoreScheduler::onBatchWrite(node_store::BatchWriteReport const& report)
|
|
{
|
|
if (jobQueue_.isStopped())
|
|
return;
|
|
|
|
jobQueue_.addLoadEvents(JtNsWrite, report.writeCount, report.elapsed);
|
|
}
|
|
|
|
} // namespace xrpl
|