diff options
author | eportnov <eportnov@ibs.ru> | 2022-08-25 17:37:46 +0300 |
---|---|---|
committer | eportnov <eportnov@ibs.ru> | 2022-08-25 17:37:46 +0300 |
commit | 1051b394764b06a8c36ba8b180bad99930fd8622 (patch) | |
tree | 71c6635621c3815ad4a07287c9eadc0b343e75aa /meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry | |
parent | 4f85e51e1daf230d6297b02323aa868b6921cc45 (diff) | |
download | openbmc-1051b394764b06a8c36ba8b180bad99930fd8622.tar.xz |
fix telemetry missing data
Diffstat (limited to 'meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry')
-rw-r--r-- | meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry/0003-fix-bug-circular-buffer.patch | 191 | ||||
-rw-r--r-- | meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry_%.bbappend | 1 |
2 files changed, 192 insertions, 0 deletions
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry/0003-fix-bug-circular-buffer.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry/0003-fix-bug-circular-buffer.patch new file mode 100644 index 0000000000..73972a50e6 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry/0003-fix-bug-circular-buffer.patch @@ -0,0 +1,191 @@ +From 0e4a90e8371dd196650e3d90dc2d8b98ab063b95 Mon Sep 17 00:00:00 2001 +From: eportnov <eportnov@ibs.ru> +Date: Thu, 25 Aug 2022 17:24:37 +0300 +Subject: [PATCH] fix bug circular buffer + +--- + src/report.cpp | 31 +++++++--------------- + src/report.hpp | 7 ++--- + src/types/readings.hpp | 6 +++-- + src/utils/queue_list.hpp | 55 ++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 72 insertions(+), 27 deletions(-) + create mode 100644 src/utils/queue_list.hpp + +diff --git a/src/report.cpp b/src/report.cpp +index a53f287..5d35006 100644 +--- a/src/report.cpp ++++ b/src/report.cpp +@@ -387,44 +387,31 @@ std::unique_ptr<sdbusplus::asio::dbus_interface> + return dbusIface; + } + +-Readings Report::getHourReadings() ++Readings Report::getHourReadings() const + { +- static constexpr int ZERO_POSITION = 0; +- + Readings result; + std::get<0>(result) = std::get<0>(readings); +- auto& result_read = std::get<1>(result);; +- +- auto& read = std::get<1>(readings); +- auto hour_pos = GetPositionOnLastHour(read); + +- if(hour_pos == ZERO_POSITION) +- { +- return readings; +- } +- std::copy(read.begin() + hour_pos, read.end(), std::back_inserter(result_read)); ++ CopyHourData(std::get<1>(readings), std::get<1>(result)); + + return result; + } + +-int Report::GetPositionOnLastHour(const std::vector<ReadingData>& readings) ++void Report::CopyHourData(const std::list<ReadingData>& readings, std::list<ReadingData>& result) const + { + static constexpr uint32_t SECONDS_IN_HOUR = 60*60; +- static constexpr int DEFAULT_RESULT = 0; +- ++ + uint64_t time_past_hour = std::chrono::duration_cast<std::chrono::seconds>( + std::chrono::system_clock::now().time_since_epoch()).count() - SECONDS_IN_HOUR; +- +- +- for(auto it = readings.rbegin(); it !=readings.rend(); ++it) ++ for(auto reading_it = readings.rbegin(); reading_it !=readings.rend(); ++reading_it) + { +- auto reading_time = std::get<2>(*it); +- if(reading_time < time_past_hour) ++ auto reading_time = std::get<2>(*reading_it); ++ if(reading_time <= time_past_hour) + { +- return abs(readings.rend() - it); ++ return; + } ++ result.push_front(*reading_it); + } +- return DEFAULT_RESULT; + } + + void Report::timerProcForPeriodicReport(boost::system::error_code ec, +diff --git a/src/report.hpp b/src/report.hpp +index 5353ce5..4a9e2b3 100644 +--- a/src/report.hpp ++++ b/src/report.hpp +@@ -23,6 +23,7 @@ + #include <chrono> + #include <memory> + #include <unordered_set> ++#include "utils/queue_list.hpp" + + class Report : public interfaces::Report, public interfaces::MetricListener + { +@@ -105,8 +106,8 @@ class Report : public interfaces::Report, public interfaces::MetricListener + bool shouldStoreMetricValues() const; + void updateReadings(); + void updateReportingType(ReportingType); +- Readings getHourReadings(); +- int GetPositionOnLastHour(const std::vector<ReadingData>& readings); ++ Readings getHourReadings() const; ++ void CopyHourData(const std::list<ReadingData>& readings, std::list<ReadingData>& result) const; + + std::string id; + std::string name; +@@ -120,7 +121,7 @@ class Report : public interfaces::Report, public interfaces::MetricListener + std::optional<uint64_t> appendLimit; + ReportUpdates reportUpdates; + Readings readings = {}; +- CircularVector<ReadingData> readingsBuffer; ++ QueueList<ReadingData> readingsBuffer; + std::shared_ptr<sdbusplus::asio::object_server> objServer; + std::unique_ptr<sdbusplus::asio::dbus_interface> reportIface; + std::unique_ptr<sdbusplus::asio::dbus_interface> deleteIface; +diff --git a/src/types/readings.hpp b/src/types/readings.hpp +index ec419ec..05a39fc 100644 +--- a/src/types/readings.hpp ++++ b/src/types/readings.hpp +@@ -1,10 +1,12 @@ + #pragma once + ++#include <list> ++ + #include "utils/labeled_tuple.hpp" + #include "utils/tstring.hpp" + + using ReadingData = std::tuple<std::string, double, uint32_t>; +-using Readings = std::tuple<uint32_t, std::vector<ReadingData>>; ++using Readings = std::tuple<uint32_t, std::list<ReadingData>>; + + using LabeledReadingData = + utils::LabeledTuple<ReadingData, +@@ -12,7 +14,7 @@ using LabeledReadingData = + utils::tstring::MetricValue, utils::tstring::Timestamp>; + + using LabeledReadings = +- utils::LabeledTuple<std::tuple<uint32_t, std::vector<LabeledReadingData>>, ++ utils::LabeledTuple<std::tuple<uint32_t, std::list<LabeledReadingData>>, + utils::tstring::Timestamp, utils::tstring::Readings>; + + namespace utils +diff --git a/src/utils/queue_list.hpp b/src/utils/queue_list.hpp +new file mode 100644 +index 0000000..1d25615 +--- /dev/null ++++ b/src/utils/queue_list.hpp +@@ -0,0 +1,55 @@ ++#include <list> ++ ++template <class T> ++class QueueList ++{ ++ public: ++ QueueList(std::list<T>& externalData, size_t maxSizeIn) ++ : data(externalData), maxSize(maxSizeIn) ++ { ++ } ++ ++ template <class... Args> ++ void emplace(Args&&... args) ++ { ++ if(maxSize == 0) ++ { ++ return; ++ } ++ if(isFull()) ++ { ++ data.pop_front(); ++ } ++ data.emplace_back(std::forward<Args>(args)...); ++ } ++ ++ void clear() ++ { ++ data.clear(); ++ } ++ ++ bool isFull() const noexcept ++ { ++ return data.size() == maxSize; ++ } ++ ++ void clearAndResize(size_t newMaxSize) ++ { ++ clear(); ++ maxSize = newMaxSize; ++ } ++ ++ auto begin() const noexcept ++ { ++ return data.begin(); ++ } ++ ++ auto end() const noexcept ++ { ++ return data.end(); ++ } ++ ++ private: ++ std::list<T>& data; ++ size_t maxSize; ++}; diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry_%.bbappend b/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry_%.bbappend index e73b73cae2..8d7c0a9ee9 100644 --- a/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry_%.bbappend +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry_%.bbappend @@ -11,6 +11,7 @@ SRC_URI += "file://3017361602 \ file://3017361611 \ file://0001-set_new_report_path.patch \ file://0002-configure-telemetry.patch \ + file://0003-fix-bug-circular-buffer.patch \ " do_install:append() { install -d ${D}/var/lib/telemetry/Reports |