summaryrefslogtreecommitdiffstats
path: root/elog_serialize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'elog_serialize.cpp')
-rw-r--r--elog_serialize.cpp34
1 files changed, 28 insertions, 6 deletions
diff --git a/elog_serialize.cpp b/elog_serialize.cpp
index f8c40e1..1af1946 100644
--- a/elog_serialize.cpp
+++ b/elog_serialize.cpp
@@ -6,6 +6,12 @@
#include "elog_serialize.hpp"
#include <phosphor-logging/log.hpp>
+#include "config.h"
+
+// Register class version
+// From cereal documentation;
+// "This macro should be placed at global scope"
+CEREAL_CLASS_VERSION(phosphor::logging::Entry, CLASS_VERSION);
namespace phosphor
{
@@ -14,11 +20,13 @@ namespace logging
/** @brief Function required by Cereal to perform serialization.
* @tparam Archive - Cereal archive type (binary in our case).
- * @param[in] a - reference to Cereal archive.
- * @param[in] e - const reference to error entry.
+ * @param[in] a - reference to Cereal archive.
+ * @param[in] e - const reference to error entry.
+ * @param[in] version - Class version that enables handling
+ * a serialized data across code levels
*/
template<class Archive>
-void save(Archive& a, const Entry& e)
+void save(Archive& a, const Entry& e, const std::uint32_t version)
{
a(e.id(), e.severity(), e.timestamp(),
e.message(), e.additionalData(), e.associations(), e.resolved());
@@ -26,11 +34,13 @@ void save(Archive& a, const Entry& e)
/** @brief Function required by Cereal to perform deserialization.
* @tparam Archive - Cereal archive type (binary in our case).
- * @param[in] a - reference to Cereal archive.
- * @param[in] e - reference to error entry.
+ * @param[in] a - reference to Cereal archive.
+ * @param[in] e - reference to error entry.
+ * @param[in] version - Class version that enables handling
+ * a serialized data across code levels
*/
template<class Archive>
-void load(Archive& a, Entry& e)
+void load(Archive& a, Entry& e, const std::uint32_t version)
{
using namespace
sdbusplus::xyz::openbmc_project::Logging::server;
@@ -84,6 +94,18 @@ bool deserialize(const fs::path& path, Entry& e)
fs::remove(path);
return false;
}
+ catch(const std::length_error& e)
+ {
+ // Running into: USCiLab/cereal#192
+ // This may be indicating some other issue in the
+ // way vector may have been used inside the logging.
+ // possibly associations ??. But handling it here for
+ // now since we are anyway tossing the log
+ // TODO: openbmc/phosphor-logging#8
+ log<level::ERR>(e.what());
+ fs::remove(path);
+ return false;
+ }
}
} // namespace logging
OpenPOWER on IntegriCloud