Enable support to handle InternalFailure type dump, during elog restore
Resolves openbmc/openbmc#2078
Change-Id: Iea47b9b7c0cd6cae21642057b21c4e99d85be1e8
Signed-off-by: Jayanth Othayoth <ojayanth@in.ibm.com>
diff --git a/elog_watch.hpp b/elog_watch.hpp
index cfdf41a..588ac34 100644
--- a/elog_watch.hpp
+++ b/elog_watch.hpp
@@ -1,9 +1,12 @@
#pragma once
+#include <set>
+#include <cereal/access.hpp>
+
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>
-#include "config.h"
+#include "config.h"
#include "dump_manager.hpp"
namespace phosphor
@@ -14,9 +17,11 @@
{
using IMgr = phosphor::dump::internal::Manager;
+using EId = uint32_t;
+using ElogList = std::set<EId>;
/** @class Watch
- * @brief Adds d-bus signal based watch for elog commit.
+ * @brief Adds d-bus signal based watch for elog add and delete.
* @details This implements methods for watching for InternalFailure
* type error message and call appropriate function to initiate dump
*/
@@ -30,36 +35,58 @@
Watch(Watch&&) = default;
Watch& operator=(Watch&&) = default;
- /** @brief constructs watch for elog commits.
+ /** @brief constructs watch for elog add and delete signals.
* @param[in] bus - The Dbus bus object
* @param[in] intMgr - Dump internal Manager object
*/
- Watch(sdbusplus::bus::bus& bus, IMgr& iMgr):
- iMgr(iMgr),
- elogMatch(
- bus,
- sdbusplus::bus::match::rules::interfacesAdded() +
- sdbusplus::bus::match::rules::path_namespace(
- OBJ_LOGGING),
- std::bind(std::mem_fn(&Watch::callback),
- this, std::placeholders::_1))
- {
- //Do nothing
- }
+ Watch(sdbusplus::bus::bus& bus, IMgr& iMgr);
private:
- /** @brief Callback function for error log commit.
+ friend class cereal::access;
+
+ /** @brief Function required by Cereal to perform serialization.
+ * @tparam Archive - Cereal archive type (binary in our case).
+ * @param[in] a - reference to Cereal archive.
+ */
+ template<class Archive>
+ void serialize(Archive& a)
+ {
+ a(elogList);
+ }
+
+ /** @brief Callback function for error log add.
* @details InternalError type error message initiates
* Internal error type dump request.
* @param[in] msg - Data associated with subscribed signal
*/
- void callback(sdbusplus::message::message& msg);
+ void addCallback(sdbusplus::message::message& msg);
+
+ /** @brief Callback function for error log delete.
+ * @param[in] msg - Data associated with subscribed signal
+ */
+ void delCallback(sdbusplus::message::message& msg);
+
+ /** @brief get elog ID from elog entry object string.
+ * @param[in] objectPath - elog entry object path.
+ * @return - elog id.
+ */
+ inline EId getEid(const std::string& objectPath)
+ {
+ fs::path path(objectPath);
+ return std::stoul(path.filename());
+ }
/** @brief Dump internal Manager object. */
IMgr& iMgr;
- /** @brief sdbusplus signal match for elog commit */
- sdbusplus::bus::match_t elogMatch;
+ /** @brief sdbusplus signal match for elog add */
+ sdbusplus::bus::match_t addMatch;
+
+ /** @brief sdbusplus signal match for elog delete */
+ sdbusplus::bus::match_t delMatch;
+
+ /** @brief List of elog ids, which have associated dumps created */
+ ElogList elogList;
};
}//namespace elog