ipmi: Add sdr cache reset logs Add some limited logs on when sensor cache gets reset every 30 seconds. Tested: ipmi still works after updating the library ``` $ systemctl restart phosphor-ipmi-host $ ipmitool sdr BRICK2_P12V_IOUT | 13.08 Amps | ok CPU0_P1V1_IOUT | 7.75 Amps | ok CPU0_P1V8_IOUT | 6.39 Amps | ok CPU0_P3V3_IOUT | 0 Amps | ok ``` Log Example with the timeout working. Restart the psu sensors to reset the sdr cache. ``` $ journalctl -f | grep "Sensor Cache Tree" May 29 13:12:35 gbmc ipmid[18845]: Sensor Cache Tree reset with /xyz/openbmc_project/sensors/current/BRICK2_P12V_IOUT/chassis ... May 29 13:12:35 gbmc ipmid[18845]: Sensor Cache Tree reset with /xyz/openbmc_project/sensors/current/CPU0_VSOC_IOUT/inventory May 29 13:13:14 gbmc ipmid[18845]: Sensor Cache Tree reset with /xyz/openbmc_project/sensors/current/BRICK2_P12V_IOUT/chassis ... ``` Fusion-Link: http://fusion2/66e1dc13-01b8-3808-8f90-5e2af7e19f43 Google-Bug-Id: 325269540 Change-Id: Id1cfecfab5e37412f6e72cc90ca2e7fca47f4816 Signed-off-by: Willy Tu <wltu@google.com> (cherry picked from commit 4bb47cba39c2c4041c5e1cc90e589e715b37be9a)
diff --git a/recipes-phosphor/ipmi/phosphor-ipmi-host/0007-dbus-sdr-Add-limited-log-on-sensorTree-Resets.patch b/recipes-phosphor/ipmi/phosphor-ipmi-host/0007-dbus-sdr-Add-limited-log-on-sensorTree-Resets.patch new file mode 100644 index 0000000..75b51c4 --- /dev/null +++ b/recipes-phosphor/ipmi/phosphor-ipmi-host/0007-dbus-sdr-Add-limited-log-on-sensorTree-Resets.patch
@@ -0,0 +1,160 @@ +From efda29daceb0dd149744a4d9a3f0f46dcd9bedd8 Mon Sep 17 00:00:00 2001 +From: Willy Tu <wltu@google.com> +Date: Wed, 29 May 2024 17:50:09 +0000 +Subject: [PATCH] dbus-sdr: Add limited log on sensorTree Resets + +Tested: +ipmi still works after updating the library +``` +$ systemctl restart phosphor-ipmi-host +$ ipmitool sdr +BRICK2_P12V_IOUT | 13.08 Amps | ok +CPU0_P1V1_IOUT | 7.75 Amps | ok +CPU0_P1V8_IOUT | 6.39 Amps | ok +CPU0_P3V3_IOUT | 0 Amps | ok +``` + +Log Example with the timeout working +``` +root@yscdn3-nfd01:~# journalctl -f | grep "Sensor Cache Tree" +May 29 13:12:35 gbmc ipmid[18845]: Sensor Cache Tree reset with /xyz/openbmc_project/sensors/current/BRICK2_P12V_IOUT/chassis +... +May 29 13:12:35 gbmc ipmid[18845]: Sensor Cache Tree reset with /xyz/openbmc_project/sensors/current/CPU0_VSOC_IOUT/inventory + +May 29 13:13:14 gbmc ipmid[18845]: Sensor Cache Tree reset with /xyz/openbmc_project/sensors/current/BRICK2_P12V_IOUT/chassis +... +``` + +Patch Tracking Bug: b/343799072 +Upstream info / review: http://go/openbmccl/71702 +Upstream-Status: Submitted +Justification: bugfix(b/325269540). Pending upstream reviews. +Google-Bug-Id: 325269540 +Google-Bug-Id: 343799072 +Change-Id: Ie804a3e9a9ca19e6856a0cf65ca9170c6edeca05 +Signed-off-by: Willy Tu <wltu@google.com> +--- + dbus-sdr/sdrutils.cpp | 37 ++++++++++++++++++++++++++++++++--- + dbus-sdr/sensorcommands.cpp | 2 ++ + include/dbus-sdr/sdrutils.hpp | 1 + + 3 files changed, 37 insertions(+), 3 deletions(-) + +diff --git a/dbus-sdr/sdrutils.cpp b/dbus-sdr/sdrutils.cpp +index 981e1c7..b7edfa3 100644 +--- a/dbus-sdr/sdrutils.cpp ++++ b/dbus-sdr/sdrutils.cpp +@@ -21,8 +21,9 @@ + #include <ipmid/utils.hpp> + + #include <algorithm> +-#include <regex> ++#include <chrono> + #include <optional> ++#include <regex> + #include <unordered_set> + + constexpr std::array<const char*, 7> suffixes = { +@@ -144,6 +145,7 @@ bool isExpectedInventoryInterfacesAdded(sdbusplus::message_t& message) + // Only expects Item.Cable interface for now + if (pair.first == itemCableInterface) + { ++ logCacheReset(path.str); + return true; + } + } +@@ -162,6 +164,34 @@ bool isInSkipTempSensorRegex(std::string_view path) + return std::regex_match(sensorName, skipRegex); + } + ++void logCacheReset(std::string_view path) ++{ ++ static std::chrono::time_point cacheLogTime = ++ std::chrono::system_clock::now(); ++ constexpr std::chrono::seconds cacheLogTimeout(30); ++ constexpr uint8_t loggingLimit = 30; ++ static uint8_t logCount = 0; ++ ++ std::chrono::time_point now = std::chrono::system_clock::now(); ++ std::chrono::duration<double> elapsedSeconds = now - cacheLogTime; ++ // If the logCount is greater than the limit and we haven't timedout... then ++ // should stop logging until the timer resets. ++ if (logCount > loggingLimit && elapsedSeconds < cacheLogTimeout) ++ { ++ return; ++ } ++ ++ // Reset logCount and start of cacheLogTime if we have already timedout. ++ if (elapsedSeconds >= cacheLogTimeout) ++ { ++ logCount = 0; ++ cacheLogTime = now; ++ } ++ ++ logCount++; ++ std::cerr << "Sensor Cache Tree reset with " << path << std::endl; ++} ++ + uint16_t getSensorSubtree(std::shared_ptr<SensorSubTree>& subtree) + { + static std::shared_ptr<SensorSubTree> sensorTreePtr; +@@ -176,6 +206,7 @@ uint16_t getSensorSubtree(std::shared_ptr<SensorSubTree>& subtree) + msg.read(path); + if (isInSkipTempSensorRegex(path.str)) + return; ++ logCacheReset(path.str); + sensorTreePtr.reset(); + }); + +@@ -188,6 +219,7 @@ uint16_t getSensorSubtree(std::shared_ptr<SensorSubTree>& subtree) + msg.read(path); + if (isInSkipTempSensorRegex(path.str)) + return; ++ logCacheReset(path.str); + sensorTreePtr.reset(); + }); + +@@ -223,8 +255,7 @@ uint16_t getSensorSubtree(std::shared_ptr<SensorSubTree>& subtree) + + static constexpr const int32_t depth = 2; + +- auto lbdUpdateSensorTree = [&dbus](const char* path, +- const auto& interfaces, ++ auto lbdUpdateSensorTree = [&dbus](const char* path, const auto& interfaces, + const bool groupByObjPath = false) { + auto mapperCall = dbus->new_method_call( + "xyz.openbmc_project.ObjectMapper", +diff --git a/dbus-sdr/sensorcommands.cpp b/dbus-sdr/sensorcommands.cpp +index a2bebd3..f2bdd46 100644 +--- a/dbus-sdr/sensorcommands.cpp ++++ b/dbus-sdr/sensorcommands.cpp +@@ -140,6 +140,7 @@ static sdbusplus::bus::match_t sensorAdded( + msg.read(path); + if (details::isInSkipTempSensorRegex(path.str)) + return; ++ details::logCacheReset(path.str); + getSensorTree().clear(); + getIpmiDecoratorPaths(/*ctx=*/std::nullopt).reset(); + sdrLastAdd = std::chrono::duration_cast<std::chrono::seconds>( +@@ -156,6 +157,7 @@ static sdbusplus::bus::match_t sensorRemoved( + msg.read(path); + if (details::isInSkipTempSensorRegex(path.str)) + return; ++ details::logCacheReset(path.str); + getSensorTree().clear(); + getIpmiDecoratorPaths(/*ctx=*/std::nullopt).reset(); + sdrLastRemove = std::chrono::duration_cast<std::chrono::seconds>( +diff --git a/include/dbus-sdr/sdrutils.hpp b/include/dbus-sdr/sdrutils.hpp +index 1fa634a..d1c98ab 100644 +--- a/include/dbus-sdr/sdrutils.hpp ++++ b/include/dbus-sdr/sdrutils.hpp +@@ -286,6 +286,7 @@ bool getSensorNumMap(std::shared_ptr<SensorNumMap>& sensorNumMap); + bool isExpectedInventoryInterfacesRemoved(sdbusplus::message_t& message); + bool isExpectedInventoryInterfacesAdded(sdbusplus::message_t& message); + bool isInSkipTempSensorRegex(std::string_view path); ++void logCacheReset(std::string_view path); + } // namespace details + + bool getSensorSubtree(SensorSubTree& subtree); +-- +2.45.1.288.g0e0cd299f1-goog +
diff --git a/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend b/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend index 89e8688..43b4412 100644 --- a/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend +++ b/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend
@@ -9,4 +9,5 @@ file://0004-Fix-ID-String-Type-Length-Code-byte-for-get-sdr-comm.patch \ file://0005-dbus-sdr-add-event-type-for-sdr-count.patch \ file://0006-dbus-sdr-fix-write-permission-for-external-sen.patch \ + file://0007-dbus-sdr-Add-limited-log-on-sensorTree-Resets.patch \ "