nvme_manager: Add checking the inventory changing
The service will read NVMe drives every second, If we set
the inventory properties to Object Dbus continuously without check
inventory changing, that may make the Object Dbus is time-out response.
This patch will add the serial number, smartwarning, statusflag checking
before setting the inventory properties.
Signed-off-by: Chanh Nguyen <chanh@os.amperecomputing.com>
Change-Id: Ibcd4d97c4c8df6d2e59ae973c4214d1d0c875a5e
diff --git a/nvme_manager.cpp b/nvme_manager.cpp
index 95fb985..d15732c 100644
--- a/nvme_manager.cpp
+++ b/nvme_manager.cpp
@@ -58,51 +58,71 @@
using namespace phosphor::logging;
void Nvme::setNvmeInventoryProperties(
- bool present, const phosphor::nvme::Nvme::NVMeData& nvmeData,
+ NVMeConfig& config, bool present,
+ const phosphor::nvme::Nvme::NVMeData& nvmeData,
const std::string& inventoryPath)
{
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- ITEM_IFACE, "Present", present);
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- ASSET_IFACE, "Manufacturer", nvmeData.vendor);
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- ASSET_IFACE, "SerialNumber",
- nvmeData.serialNumber);
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- ASSET_IFACE, "Model", nvmeData.modelNumber);
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "SmartWarnings",
- nvmeData.smartWarnings);
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "StatusFlags",
- nvmeData.statusFlags);
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "DriveLifeUsed",
- nvmeData.driveLifeUsed);
+ static std::unordered_map<int, std::string> preSerial;
+ static std::unordered_map<int, std::string> preSmartWarning;
+ static std::unordered_map<int, std::string> preStatusFlags;
- auto smartWarning = (!nvmeData.smartWarnings.empty())
- ? std::stoi(nvmeData.smartWarnings, 0, 16)
- : NOWARNING;
+ if (preSerial[config.busID].compare(nvmeData.serialNumber) != 0)
+ {
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ ITEM_IFACE, "Present", present);
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ ASSET_IFACE, "Manufacturer",
+ nvmeData.vendor);
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ ASSET_IFACE, "SerialNumber",
+ nvmeData.serialNumber);
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ ASSET_IFACE, "Model",
+ nvmeData.modelNumber);
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "DriveLifeUsed",
+ nvmeData.driveLifeUsed);
+ preSerial[config.busID] = nvmeData.serialNumber;
+ }
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "CapacityFault",
- !(smartWarning & CapacityFaultMask));
+ if (preStatusFlags[config.busID].compare(nvmeData.statusFlags) != 0)
+ {
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "StatusFlags",
+ nvmeData.statusFlags);
+ preStatusFlags[config.busID] = nvmeData.statusFlags;
+ }
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "TemperatureFault",
- !(smartWarning & temperatureFaultMask));
+ if (preSmartWarning[config.busID].compare(nvmeData.smartWarnings) != 0)
+ {
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "SmartWarnings",
+ nvmeData.smartWarnings);
+ auto smartWarning = (!nvmeData.smartWarnings.empty())
+ ? std::stoi(nvmeData.smartWarnings, 0, 16)
+ : NOWARNING;
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "DegradesFault",
- !(smartWarning & DegradesFaultMask));
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "CapacityFault",
+ !(smartWarning & CapacityFaultMask));
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "MediaFault",
- !(smartWarning & MediaFaultMask));
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "TemperatureFault",
+ !(smartWarning & temperatureFaultMask));
- util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
- NVME_STATUS_IFACE, "BackupDeviceFault",
- !(smartWarning & BackupDeviceFaultMask));
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "DegradesFault",
+ !(smartWarning & DegradesFaultMask));
+
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "MediaFault",
+ !(smartWarning & MediaFaultMask));
+
+ util::SDBusPlus::setProperty(bus, INVENTORY_BUSNAME, inventoryPath,
+ NVME_STATUS_IFACE, "BackupDeviceFault",
+ !(smartWarning & BackupDeviceFaultMask));
+ preSmartWarning[config.busID] = nvmeData.smartWarnings;
+ }
}
void Nvme::setFaultLED(const std::string& locateLedGroupPath,
@@ -543,7 +563,7 @@
std::make_shared<phosphor::nvme::NvmeSSD>(bus, objPath.c_str());
nvmes.emplace(config.index, nvmeSSD);
- setNvmeInventoryProperties(true, nvmeData, inventoryPath);
+ setNvmeInventoryProperties(config, true, nvmeData, inventoryPath);
nvmeSSD->setSensorValueToDbus(nvmeData.sensorValue);
if (nvmeData.wcTemp != 0)
{
@@ -559,7 +579,7 @@
}
else
{
- setNvmeInventoryProperties(true, nvmeData, inventoryPath);
+ setNvmeInventoryProperties(config, true, nvmeData, inventoryPath);
iter->second->setSensorValueToDbus(nvmeData.sensorValue);
if (nvmeData.wcTemp != 0)
{
@@ -606,7 +626,8 @@
config.locateLedControllerPath, false);
nvmeData = NVMeData();
- setNvmeInventoryProperties(false, nvmeData, inventoryPath);
+ setNvmeInventoryProperties(config, false, nvmeData,
+ inventoryPath);
nvmes.erase(config.index);
continue;
}
@@ -629,7 +650,8 @@
config.locateLedControllerPath, false);
nvmeData = NVMeData();
- setNvmeInventoryProperties(true, nvmeData, inventoryPath);
+ setNvmeInventoryProperties(config, true, nvmeData,
+ inventoryPath);
if (isErrorPower[config.index] != true)
{
diff --git a/nvme_manager.hpp b/nvme_manager.hpp
index 78eabe3..391a768 100644
--- a/nvme_manager.hpp
+++ b/nvme_manager.hpp
@@ -119,7 +119,8 @@
/** @brief Set inventory properties of nvme */
void setNvmeInventoryProperties(
- bool present, const phosphor::nvme::Nvme::NVMeData& nvmeData,
+ NVMeConfig& config, bool present,
+ const phosphor::nvme::Nvme::NVMeData& nvmeData,
const std::string& inventoryPath);
void createNVMeInventory();