PEL: Tell HostNotifier about deleted PELs
Have the HostNotifier class subscribe to the Repository class's PEL
deletion callbacks so that when a PEL is deleted HostNotifier can remove
that PEL from its queue and also from its sent list.
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I37c61bd62f208512e0c45a628548e0881272d2f5
diff --git a/extensions/openpower-pels/host_notifier.cpp b/extensions/openpower-pels/host_notifier.cpp
index 175a644..b268c9c 100644
--- a/extensions/openpower-pels/host_notifier.cpp
+++ b/extensions/openpower-pels/host_notifier.cpp
@@ -40,6 +40,12 @@
std::bind(std::mem_fn(&HostNotifier::newLogCallback),
this, std::placeholders::_1));
+ // Subscribe to be told about deleted PELs.
+ _repo.subscribeToDeletes(
+ subscriptionName,
+ std::bind(std::mem_fn(&HostNotifier::deleteLogCallback), this,
+ std::placeholders::_1));
+
// Add any existing PELs to the queue to send them if necessary.
_repo.for_each(std::bind(std::mem_fn(&HostNotifier::addPELToQueue), this,
std::placeholders::_1));
@@ -188,6 +194,31 @@
}
}
+void HostNotifier::deleteLogCallback(uint32_t id)
+{
+ auto queueIt = std::find(_pelQueue.begin(), _pelQueue.end(), id);
+ if (queueIt != _pelQueue.end())
+ {
+ log<level::DEBUG>("Host notifier removing deleted log from queue");
+ _pelQueue.erase(queueIt);
+ }
+
+ auto sentIt = std::find(_sentPELs.begin(), _sentPELs.end(), id);
+ if (sentIt != _sentPELs.end())
+ {
+ log<level::DEBUG>("Host notifier removing deleted log from sent list");
+ _sentPELs.erase(sentIt);
+ }
+
+ // Nothing we can do about this...
+ if (id == _inProgressPEL)
+ {
+ log<level::WARNING>(
+ "A PEL was deleted while its host notification was in progress",
+ entry("PEL_ID=0x%X", id));
+ }
+}
+
void HostNotifier::scheduleDispatch()
{
_dispatcher = std::make_unique<sdeventplus::source::Defer>(
diff --git a/extensions/openpower-pels/host_notifier.hpp b/extensions/openpower-pels/host_notifier.hpp
index cad2b36..24c3f6f 100644
--- a/extensions/openpower-pels/host_notifier.hpp
+++ b/extensions/openpower-pels/host_notifier.hpp
@@ -171,6 +171,17 @@
void newLogCallback(const PEL& pel);
/**
+ * @brief This function gets called by the Repository class
+ * when a PEL is deleted.
+ *
+ * The deleted ID will be removed from the PEL queue and the
+ * sent list.
+ *
+ * @param[in] id - The deleted PEL ID
+ */
+ void deleteLogCallback(uint32_t id);
+
+ /**
* @brief This function runs on every existing PEL at startup
* and puts the PEL on the queue to send if necessary.
*