From ea326a9cc7e8ea4bcd9668ee93bfe81a67b9bdf4 Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Fri, 30 Jul 2021 14:04:36 +0200 Subject: [PATCH] feat(storage): Log time taken for secondary storage operations --- src/storage/Storage.cpp | 30 +++++++++++++++++++----- src/util/Timer.hpp | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 src/util/Timer.hpp diff --git a/src/storage/Storage.cpp b/src/storage/Storage.cpp index 548b22685..7bd7d439c 100644 --- a/src/storage/Storage.cpp +++ b/src/storage/Storage.cpp @@ -31,6 +31,7 @@ # include #endif #include +#include #include #include #include @@ -334,7 +335,9 @@ Storage::get_from_secondary_storage(const Digest& key) continue; } + Timer timer; const auto result = entry->backend->get(key); + const auto ms = timer.measure_ms(); if (!result) { mark_backend_as_failed(*entry, result.error()); continue; @@ -342,10 +345,14 @@ Storage::get_from_secondary_storage(const Digest& key) const auto& value = *result; if (value) { - LOG("Retrieved {} from {}", key.to_string(), entry->url_for_logging); + LOG("Retrieved {} from {} ({:.2f} ms)", + key.to_string(), + entry->url_for_logging, + ms); return *value; } else { - LOG("No {} in {}", key.to_string(), entry->url_for_logging); + LOG( + "No {} in {} ({:.2f} ms)", key.to_string(), entry->url_for_logging, ms); } } @@ -360,7 +367,9 @@ Storage::put_in_secondary_storage(const Digest& key, const std::string& value) continue; } + Timer timer; const auto result = entry->backend->put(key, value); + const auto ms = timer.measure_ms(); if (!result) { // The backend is expected to log details about the error. mark_backend_as_failed(*entry, result.error()); @@ -368,10 +377,11 @@ Storage::put_in_secondary_storage(const Digest& key, const std::string& value) } const bool stored = *result; - LOG("{} {} in {}", + LOG("{} {} in {} ({:.2f} ms)", stored ? "Stored" : "Failed to store", key.to_string(), - entry->url_for_logging); + entry->url_for_logging, + ms); } } @@ -383,7 +393,9 @@ Storage::remove_from_secondary_storage(const Digest& key) continue; } + Timer timer; const auto result = entry->backend->remove(key); + const auto ms = timer.measure_ms(); if (!result) { mark_backend_as_failed(*entry, result.error()); continue; @@ -391,9 +403,15 @@ Storage::remove_from_secondary_storage(const Digest& key) const bool removed = *result; if (removed) { - LOG("Removed {} from {}", key.to_string(), entry->url_for_logging); + LOG("Removed {} from {} ({:.2f} ms)", + key.to_string(), + entry->url_for_logging, + ms); } else { - LOG("No {} to remove from {}", key.to_string(), entry->url_for_logging); + LOG("No {} to remove from {} ({:.2f} ms)", + key.to_string(), + entry->url_for_logging, + ms); } } } diff --git a/src/util/Timer.hpp b/src/util/Timer.hpp new file mode 100644 index 000000000..afbf7ab02 --- /dev/null +++ b/src/util/Timer.hpp @@ -0,0 +1,51 @@ +// Copyright (C) 2021 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +#include +#include + +class Timer +{ +public: + Timer(); + + double measure_s() const; + double measure_ms() const; + +private: + std::chrono::steady_clock::time_point m_start; +}; + +inline Timer::Timer() : m_start(std::chrono::steady_clock::now()) +{ +} + +inline double +Timer::measure_s() const +{ + using namespace std::chrono; + return duration_cast>(steady_clock::now() - m_start).count(); +} + +inline double +Timer::measure_ms() const +{ + return measure_s() * 1000; +} -- 2.47.2