summaryrefslogtreecommitdiff
path: root/meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry
diff options
context:
space:
mode:
authoreportnov <eportnov@ibs.ru>2022-08-25 17:37:46 +0300
committereportnov <eportnov@ibs.ru>2022-08-25 17:37:46 +0300
commit1051b394764b06a8c36ba8b180bad99930fd8622 (patch)
tree71c6635621c3815ad4a07287c9eadc0b343e75aa /meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry
parent4f85e51e1daf230d6297b02323aa868b6921cc45 (diff)
downloadopenbmc-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.patch191
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/telemetry/telemetry_%.bbappend1
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