Fix PID failsafe loggers This CL fixes the silence issue of PID failsafe loggers. This CL also deprecates pointers for PID failsafe loggers to fix the crashes. Tested: https://paste.googleplex.com/6195713150812160 (No crash happens) https://paste.googleplex.com/4789243163181056 (The logs appear) https://fusion2.corp.google.com/6f303831-040f-31c0-a747-2c7c4458b54c https://fusion2.corp.google.com/b2560a17-2a26-36a0-a1e9-b13a4d395f02 https://fusion2.corp.google.com/b62ed499-47ba-30bc-97c5-4675fafe01cc Change-Id: I6d93aca91d8608c860768bad8a51fc814b694bcf Google-Bug-Id: 437375644 Google-Bug-Id: 403313360 Signed-off-by: James Zheng <alphetis@google.com>
diff --git a/recipes-phosphor/fans/phosphor-pid-control/0001-Fix-PID-failsafe-loggers.patch b/recipes-phosphor/fans/phosphor-pid-control/0001-Fix-PID-failsafe-loggers.patch new file mode 100644 index 0000000..8cb4017 --- /dev/null +++ b/recipes-phosphor/fans/phosphor-pid-control/0001-Fix-PID-failsafe-loggers.patch
@@ -0,0 +1,145 @@ +From 124b0fdcab70682d39d28f6890ec2a39e2ef0667 Mon Sep 17 00:00:00 2001 +From: James Zheng <alphetis@google.com> +Date: Thu, 14 Aug 2025 17:59:59 +0000 +Subject: [PATCH] Fix PID failsafe logger + +Signed-off-by: James Zheng <alphetis@google.com> + +--- + failsafeloggers/builder.cpp | 6 ++-- + failsafeloggers/failsafe_logger.cpp | 2 +- + failsafeloggers/failsafe_logger.hpp | 5 ++- + failsafeloggers/failsafe_logger_utility.cpp | 5 ++- + failsafeloggers/failsafe_logger_utility.hpp | 35 ++++++++++----------- + 5 files changed, 26 insertions(+), 27 deletions(-) + +diff --git a/failsafeloggers/builder.cpp b/failsafeloggers/builder.cpp +index 648abdc..c3a1b19 100644 +--- a/failsafeloggers/builder.cpp ++++ b/failsafeloggers/builder.cpp +@@ -33,14 +33,12 @@ void buildFailsafeLoggers( + const std::unordered_map<int64_t, std::shared_ptr<ZoneInterface>>& zones, + const size_t logMaxCountPerSecond /* = 20 */) { + zoneIdToFailsafeLogger = +- std::unordered_map<int64_t, +- std::shared_ptr<pid_control::FailsafeLogger>>(); ++ std::unordered_map<int64_t, pid_control::FailsafeLogger>(); + sensorNameToZoneId = std::unordered_map<std::string, std::vector<int64_t>>(); + for (const auto& zoneIdToZone : zones) { + int64_t zoneId = zoneIdToZone.first; + // Create a failsafe logger for each zone. +- zoneIdToFailsafeLogger[zoneId] = +- std::make_shared<FailsafeLogger>( ++ zoneIdToFailsafeLogger[zoneId] = FailsafeLogger( + logMaxCountPerSecond, zoneIdToZone.second->getFailSafeMode()); + + // Build the sensor-zone topology map. +diff --git a/failsafeloggers/failsafe_logger.cpp b/failsafeloggers/failsafe_logger.cpp +index ace08e9..d10a540 100644 +--- a/failsafeloggers/failsafe_logger.cpp ++++ b/failsafeloggers/failsafe_logger.cpp +@@ -28,7 +28,7 @@ void FailsafeLogger::outputFailsafeLog(const int64_t zoneId, + // encountered in the current state. + std::string locationReason = location + " @ " + reason; + if (_logTimestamps.size() >= _logMaxCountPerSecond || +- !_logsInCurrentState.contains(locationReason)) { ++ _logsInCurrentState.contains(locationReason)) { + return; + } + _logsInCurrentState.insert(locationReason); +diff --git a/failsafeloggers/failsafe_logger.hpp b/failsafeloggers/failsafe_logger.hpp +index 6ac0ba5..53883b6 100644 +--- a/failsafeloggers/failsafe_logger.hpp ++++ b/failsafeloggers/failsafe_logger.hpp +@@ -32,7 +32,10 @@ class FailsafeLogger + FailsafeLogger(size_t logMaxCountPerSecond = 20, + bool currentFailsafeState = false) + : _logMaxCountPerSecond(logMaxCountPerSecond), +- _currentFailsafeState(currentFailsafeState) {} ++ _currentFailsafeState(currentFailsafeState) { ++ _logTimestamps.clear(); ++ _logsInCurrentState.clear(); ++ } + ~FailsafeLogger() = default; + + /** Attempt to output an entering/leaving-failsafe-mode log. +diff --git a/failsafeloggers/failsafe_logger_utility.cpp b/failsafeloggers/failsafe_logger_utility.cpp +index 6e9d6aa..4ca17f0 100644 +--- a/failsafeloggers/failsafe_logger_utility.cpp ++++ b/failsafeloggers/failsafe_logger_utility.cpp +@@ -3,9 +3,8 @@ + #include <string> + + +-std::unordered_map<int64_t, std::shared_ptr<pid_control::FailsafeLogger>> +- zoneIdToFailsafeLogger = +- std::unordered_map<int64_t, std::shared_ptr<pid_control::FailsafeLogger>>(); ++std::unordered_map<int64_t, pid_control::FailsafeLogger> zoneIdToFailsafeLogger = ++ std::unordered_map<int64_t, pid_control::FailsafeLogger>(); + + std::unordered_map<std::string, std::vector<int64_t>> + sensorNameToZoneId = std::unordered_map<std::string, std::vector<int64_t>>(); +diff --git a/failsafeloggers/failsafe_logger_utility.hpp b/failsafeloggers/failsafe_logger_utility.hpp +index 9ccdff3..7106808 100644 +--- a/failsafeloggers/failsafe_logger_utility.hpp ++++ b/failsafeloggers/failsafe_logger_utility.hpp +@@ -10,8 +10,7 @@ + + /** Map of the zone ID to its failsafe logger. + */ +-extern std::unordered_map<int64_t, std::shared_ptr<pid_control::FailsafeLogger>> +- zoneIdToFailsafeLogger; ++extern std::unordered_map<int64_t, pid_control::FailsafeLogger> zoneIdToFailsafeLogger; + + /** Map of the sensor name/ID to its corresponding zone IDs. + */ +@@ -33,31 +32,31 @@ extern const std::string failsafeReasonFailSensorNotFunctional; + namespace pid_control { + + /** Given a sensor name, attempt to output entering/leaving-failsafe-mode +- * logs for its corresponding zones. ++ * logs for its corresponding zones. + */ + inline void outputFailsafeLogWithSensor(const std::string sensorName, +- const bool newFailsafeState, +- const std::string location, +- const std::string& reason) { ++ bool newFailsafeState, ++ const std::string& location, ++ const std::string& reason) { + for (const int64_t zoneId : sensorNameToZoneId[sensorName]) { +- zoneIdToFailsafeLogger[zoneId]->outputFailsafeLog(zoneId, +- newFailsafeState, +- location, +- reason); ++ zoneIdToFailsafeLogger[zoneId].outputFailsafeLog(zoneId, ++ newFailsafeState, ++ location, ++ reason); + } + } + + /** Given a zone ID, attempt to output entering/leaving-failsafe-mode +- * logs for its corresponding zones. ++ * logs for it. + */ + inline void outputFailsafeLogWithZone(const int64_t zoneId, +- const bool newFailsafeState, +- const std::string location, +- const std::string& reason) { +- zoneIdToFailsafeLogger[zoneId]->outputFailsafeLog(zoneId, +- newFailsafeState, +- location, +- reason); ++ bool newFailsafeState, ++ const std::string& location, ++ const std::string& reason) { ++ zoneIdToFailsafeLogger[zoneId].outputFailsafeLog(zoneId, ++ newFailsafeState, ++ location, ++ reason); + } + } // namespace pid_control + +-- +2.51.0.rc1.163.g2494970778-goog \ No newline at end of file
diff --git a/recipes-phosphor/fans/phosphor-pid-control_%.bbappend b/recipes-phosphor/fans/phosphor-pid-control_%.bbappend index 34f15bc..726d1a0 100644 --- a/recipes-phosphor/fans/phosphor-pid-control_%.bbappend +++ b/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
@@ -5,4 +5,5 @@ file://0001-set-fan-pwm-forcely.patch \ file://0001-Add-failsafe-logger-for-zones.patch \ file://0001-Optimize-failsafe-logger.patch \ + file://0001-Fix-PID-failsafe-loggers.patch \ "