platform-mc: Defer adding sensor objects from PDRs
After all PDRs retrieved from the other terminus are parsed into pdr
structs. They will be processed further to create sensor objects (e.g
via `addNumericSensor` function for Numeric Sensors).
During this phase for one sensor, sensor name is achieved (may enlist
Sensor Aux Name PDRs), and NumericSensor object is constructed.
Sensor object construction involves parsing pdr struct elements into
sensor class variables, D-Bus interface initialization and many calls
to set D-Bus object properties.
They are actually not blocking actions, but as it continuously loops
through sensor PDRs in `parseTerminusPDRs` to add sensors, they take
too much time and prevent BMC from processing events coming from other
termini. Not to mention the adding of new sensor types in the future
and the increase in sensor numbers, the total time will be large, while
this is not a primary task in the initialization phase of a terminus.
This commit defers `addNumericSensor` and `addCompactNumericSensor`
calls using sdeventplus::source::Defer event source, instead of
continuously calling them while looping through the sensor PDRs, to let
events coming from other termini break in and be processed by BMC.
Tested:
While BMC is getting, parsing sensor PDRs and creating sensor objects
from those PDRs, events can still be received from the other termini.
Change-Id: I4a3bacd4139b51c302e36614757fa1b5e5105f21
Signed-off-by: Chau Ly <chaul@amperecomputing.com>
diff --git a/platform-mc/terminus.cpp b/platform-mc/terminus.cpp
index ba299be..c262842 100644
--- a/platform-mc/terminus.cpp
+++ b/platform-mc/terminus.cpp
@@ -14,10 +14,11 @@
namespace platform_mc
{
-Terminus::Terminus(pldm_tid_t tid, uint64_t supportedTypes) :
+Terminus::Terminus(pldm_tid_t tid, uint64_t supportedTypes,
+ sdeventplus::Event& event) :
initialized(false), maxBufferSize(PLDM_PLATFORM_EVENT_MSG_MAX_BUFFER_SIZE),
synchronyConfigurationSupported(0), pollEvent(false), tid(tid),
- supportedTypes(supportedTypes)
+ supportedTypes(supportedTypes), event(event)
{}
bool Terminus::doesSupportType(uint8_t type)
@@ -119,11 +120,6 @@
void Terminus::parseTerminusPDRs()
{
- std::vector<std::shared_ptr<pldm_numeric_sensor_value_pdr>>
- numericSensorPdrs{};
- std::vector<std::shared_ptr<pldm_compact_numeric_sensor_pdr>>
- compactNumericSensorPdrs{};
-
for (auto& pdr : pdrs)
{
auto pdrHdr = new (pdr.data()) pldm_pdr_hdr;
@@ -228,15 +224,48 @@
tid, "PATH", inventoryPath);
}
- for (auto pdr : numericSensorPdrs)
+ addNextSensorFromPDRs();
+}
+
+void Terminus::addNextSensorFromPDRs()
+{
+ sensorCreationEvent.reset();
+
+ if (terminusName.empty())
{
- addNumericSensor(pdr);
+ lg2::error(
+ "Terminus ID {TID}: DOES NOT have name. Skip Adding sensors.",
+ "TID", tid);
+ return;
}
- for (auto pdr : compactNumericSensorPdrs)
+ auto pdrIt = sensorPdrIt;
+
+ if (pdrIt < numericSensorPdrs.size())
{
- addCompactNumericSensor(pdr);
+ const auto& pdr = numericSensorPdrs[pdrIt];
+ // Defer adding the next Numeric Sensor
+ sensorCreationEvent = std::make_unique<sdeventplus::source::Defer>(
+ event,
+ std::bind(std::mem_fn(&Terminus::addNumericSensor), this, pdr));
}
+ else if (pdrIt < numericSensorPdrs.size() + compactNumericSensorPdrs.size())
+ {
+ pdrIt -= numericSensorPdrs.size();
+ const auto& pdr = compactNumericSensorPdrs[pdrIt];
+ // Defer adding the next Compact Numeric Sensor
+ sensorCreationEvent = std::make_unique<sdeventplus::source::Defer>(
+ event, std::bind(std::mem_fn(&Terminus::addCompactNumericSensor),
+ this, pdr));
+ }
+ else
+ {
+ sensorPdrIt = 0;
+ return;
+ }
+
+ // Move the iteration to the next sensor PDR
+ sensorPdrIt++;
}
std::shared_ptr<SensorAuxiliaryNames> Terminus::getSensorAuxiliaryNames(
@@ -391,20 +420,12 @@
void Terminus::addNumericSensor(
const std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr)
{
- if (terminusName.empty())
- {
- lg2::error(
- "Terminus ID {TID}: DOES NOT have name. Skip Adding sensors.",
- "TID", tid);
- return;
- }
-
if (!pdr)
{
lg2::error(
"Terminus ID {TID}: Skip adding Numeric Sensor - invalid pointer to PDR.",
"TID", tid);
- return;
+ addNextSensorFromPDRs();
}
auto sensorId = pdr->sensor_id;
@@ -415,7 +436,7 @@
lg2::error(
"Terminus ID {TID}: Failed to get name for Numeric Sensor {SID}",
"TID", tid, "SID", sensorId);
- return;
+ addNextSensorFromPDRs();
}
std::string sensorName = sensorNames.front();
@@ -433,6 +454,8 @@
"Failed to create NumericSensor. error - {ERROR} sensorname - {NAME}",
"ERROR", e, "NAME", sensorName);
}
+
+ addNextSensorFromPDRs();
}
std::shared_ptr<SensorAuxiliaryNames> Terminus::parseCompactNumericSensorNames(
@@ -503,20 +526,12 @@
void Terminus::addCompactNumericSensor(
const std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr)
{
- if (terminusName.empty())
- {
- lg2::error(
- "Terminus ID {TID}: DOES NOT have name. Skip Adding sensors.",
- "TID", tid);
- return;
- }
-
if (!pdr)
{
lg2::error(
"Terminus ID {TID}: Skip adding Compact Numeric Sensor - invalid pointer to PDR.",
"TID", tid);
- return;
+ addNextSensorFromPDRs();
}
auto sensorId = pdr->sensor_id;
@@ -527,7 +542,7 @@
lg2::error(
"Terminus ID {TID}: Failed to get name for Compact Numeric Sensor {SID}",
"TID", tid, "SID", sensorId);
- return;
+ addNextSensorFromPDRs();
}
std::string sensorName = sensorNames.front();
@@ -545,6 +560,8 @@
"Failed to create Compact NumericSensor. error - {ERROR} sensorname - {NAME}",
"ERROR", e, "NAME", sensorName);
}
+
+ addNextSensorFromPDRs();
}
std::shared_ptr<NumericSensor> Terminus::getSensorObject(SensorId id)