From 4579fa2f26f0d4f3c910722fda0b8e9d76c0af97 Mon Sep 17 00:00:00 2001 From: ethanlabelle <37966268+ethanlabelle@users.noreply.github.com> Date: Wed, 29 Jun 2022 19:10:03 -0400 Subject: [PATCH] Use ledger close times for stale data warning (#194) --- src/etl/ReportingETL.cpp | 8 +++----- src/etl/ReportingETL.h | 23 +++++++++++++++++++++++ src/webserver/HttpBase.h | 4 ++-- src/webserver/WsBase.h | 5 ++--- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/etl/ReportingETL.cpp b/src/etl/ReportingETL.cpp index 28f4ece2..ae8d2c36 100644 --- a/src/etl/ReportingETL.cpp +++ b/src/etl/ReportingETL.cpp @@ -147,11 +147,9 @@ ReportingETL::publishLedger(ripple::LedgerInfo const& lgrInfo) backend_->cache().update(diff, lgrInfo.seq); backend_->updateRange(lgrInfo.seq); } - auto now = std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()) - .count(); - auto closeTime = lgrInfo.closeTime.time_since_epoch().count(); - auto age = now - (rippleEpochStart + closeTime); + + setLastClose(lgrInfo.closeTime); + auto age = lastCloseAgeSeconds(); // if the ledger closed over 10 minutes ago, assume we are still // catching up and don't publish if (age < 600) diff --git a/src/etl/ReportingETL.h b/src/etl/ReportingETL.h index 3c68d35d..3d43b409 100644 --- a/src/etl/ReportingETL.h +++ b/src/etl/ReportingETL.h @@ -139,6 +139,18 @@ private: lastPublish_ = std::chrono::system_clock::now(); } + /// The time that the most recently published ledger was closed. + std::chrono::time_point lastCloseTime_; + + mutable std::shared_mutex closeTimeMtx_; + + void + setLastClose(std::chrono::time_point lastCloseTime) + { + std::unique_lock lck(closeTimeMtx_); + lastCloseTime_ = lastCloseTime; + } + /// Download a ledger with specified sequence in full, via GetLedgerData, /// and write the data to the databases. This takes several minutes or /// longer. @@ -334,6 +346,17 @@ public: std::chrono::system_clock::now() - getLastPublish()) .count(); } + + std::uint32_t + lastCloseAgeSeconds() const + { + std::shared_lock lck(closeTimeMtx_); + auto now = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(); + auto closeTime = lastCloseTime_.time_since_epoch().count(); + return now - (rippleEpochStart + closeTime); + } }; #endif diff --git a/src/webserver/HttpBase.h b/src/webserver/HttpBase.h index c4f4b25d..8e0d170c 100644 --- a/src/webserver/HttpBase.h +++ b/src/webserver/HttpBase.h @@ -422,8 +422,8 @@ handle_request( "This is a clio server. clio only serves validated data. If you " "want to talk to rippled, include 'ledger_index':'current' in your " "request"); - auto lastPublishAge = context->etl->lastPublishAgeSeconds(); - if (lastPublishAge >= 60) + auto lastCloseAge = context->etl->lastCloseAgeSeconds(); + if (lastCloseAge >= 60) warnings.emplace_back("This server may be out of date"); result["warnings"] = warnings; responseStr = boost::json::serialize(response); diff --git a/src/webserver/WsBase.h b/src/webserver/WsBase.h index 0931c5a4..5e537b3c 100644 --- a/src/webserver/WsBase.h +++ b/src/webserver/WsBase.h @@ -351,10 +351,9 @@ public: "want to talk to rippled, include 'ledger_index':'current' in your " "request"); - auto lastPublishAge = etl_->lastPublishAgeSeconds(); - if (lastPublishAge >= 60) + auto lastCloseAge = etl_->lastCloseAgeSeconds(); + if (lastCloseAge >= 60) warnings.emplace_back("This server may be out of date"); - response["warnings"] = warnings; std::string responseStr = boost::json::serialize(response); if (!dosGuard_.add(*ip, responseStr.size()))