append warning to response if clio is out of date (#175)

Fixes #46.
This commit is contained in:
ethanlabelle
2022-06-14 14:50:42 -04:00
committed by GitHub
parent 7ecb894632
commit b45b34edb1
3 changed files with 59 additions and 17 deletions

View File

@@ -130,19 +130,12 @@ private:
/// server_info
std::chrono::time_point<std::chrono::system_clock> lastPublish_;
mutable std::mutex publishTimeMtx_;
std::chrono::time_point<std::chrono::system_clock>
getLastPublish() const
{
std::unique_lock<std::mutex> lck(publishTimeMtx_);
return lastPublish_;
}
mutable std::shared_mutex publishTimeMtx_;
void
setLastPublish()
{
std::unique_lock<std::mutex> lck(publishTimeMtx_);
std::unique_lock lck(publishTimeMtx_);
lastPublish_ = std::chrono::system_clock::now();
}
@@ -322,13 +315,25 @@ public:
result["read_only"] = readOnly_;
auto last = getLastPublish();
if (last.time_since_epoch().count() != 0)
result["last_publish_age_seconds"] = std::to_string(
std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::system_clock::now() - getLastPublish())
.count());
result["last_publish_age_seconds"] =
std::to_string(lastPublishAgeSeconds());
return result;
}
std::chrono::time_point<std::chrono::system_clock>
getLastPublish() const
{
std::shared_lock lck(publishTimeMtx_);
return lastPublish_;
}
std::uint32_t
lastPublishAgeSeconds() const
{
return std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::system_clock::now() - getLastPublish())
.count();
}
};
#endif

View File

@@ -405,9 +405,25 @@ handle_request(
responseStr = boost::json::serialize(response);
}
auto warningFlag = false;
boost::json::array warnings;
if (!dosGuard.add(ip, responseStr.size()))
result["warning"] = "Too many requests";
{
warnings.emplace_back("Too many requests");
warningFlag = true;
}
auto lastPublishAge = context->etl->lastPublishAgeSeconds();
if (lastPublishAge >= 60)
{
warnings.emplace_back("This server may be out of date");
warningFlag = true;
}
// reserialize only if a warning was appended.
if (warningFlag)
{
result["warning"] = warnings;
responseStr = boost::json::serialize(response);
}
return send(
httpResponse(http::status::ok, "application/json", responseStr));
}

View File

@@ -9,6 +9,7 @@
#include <backend/BackendInterface.h>
#include <etl/ETLSource.h>
#include <etl/ReportingETL.h>
#include <rpc/Counters.h>
#include <rpc/RPC.h>
#include <subscriptions/Message.h>
@@ -322,7 +323,27 @@ public:
}
std::string responseStr = boost::json::serialize(response);
dosGuard_.add(*ip, responseStr.size());
boost::json::array warnings;
auto warningFlag = false;
if (!dosGuard_.add(*ip, responseStr.size()))
{
warnings.emplace_back("Too many requests");
warningFlag = true;
}
auto lastPublishAge = etl_->lastPublishAgeSeconds();
if (lastPublishAge >= 60)
{
warnings.emplace_back("This server may be out of date");
warningFlag = true;
}
// reserialize if a warning was appended
if (warningFlag)
{
auto& result = response["result"].as_object();
result["warning"] = warnings;
responseStr = boost::json::serialize(response);
}
send(std::move(responseStr));
}