entry: use AdditionalData2 for serialization
Prefer the `map<std::string, std::string>` for serialization of
metadata over the `vector<std::string>` format. Add backwards
compatible parsing of the `vector<std::string>` format.
Tested: Loaded a "version 5" entry. Created a new entry and verified
it was "version 6" in the binary dump. Reloading the daemon restores
both version 5 and 6 objects.
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I39b8a4099ad61161d52c3784d6325df7da031011
diff --git a/config/config.h.meson b/config/config.h.meson
index f852bab..0c3bb6d 100644
--- a/config/config.h.meson
+++ b/config/config.h.meson
@@ -34,7 +34,8 @@
static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_UPDATE_TS = "3";
static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_EVENTID = "4";
static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_RESOLUTION = "5";
-static constexpr size_t CLASS_VERSION = 5;
+static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_METADATA_DICT = "6";
+static constexpr size_t CLASS_VERSION = 6;
static constexpr bool LG2_COMMIT_DBUS = @lg2_commit_dbus@;
static constexpr bool LG2_COMMIT_JOURNAL = @lg2_commit_journal@;
diff --git a/elog_serialize.cpp b/elog_serialize.cpp
index 1fd5a1f..6a2dac4 100644
--- a/elog_serialize.cpp
+++ b/elog_serialize.cpp
@@ -3,6 +3,7 @@
#include "elog_serialize.hpp"
#include <cereal/archives/binary.hpp>
+#include <cereal/types/map.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/tuple.hpp>
#include <cereal/types/vector.hpp>
@@ -30,7 +31,7 @@
template <class Archive>
void save(Archive& a, const Entry& e, const std::uint32_t /*version*/)
{
- a(e.id(), e.severity(), e.timestamp(), e.message(), e.additionalData(),
+ a(e.id(), e.severity(), e.timestamp(), e.message(), e.additionalData2(),
e.associations(), e.resolved(), e.version(), e.updateTimestamp(),
e.eventId(), e.resolution());
}
@@ -51,7 +52,7 @@
Entry::Level severity{};
uint64_t timestamp{};
std::string message{};
- std::vector<std::string> additionalData{};
+ std::map<std::string, std::string> additionalData{};
bool resolved{};
AssociationList associations{};
std::string fwVersion{};
@@ -61,25 +62,41 @@
if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_FWLEVEL))
{
- a(id, severity, timestamp, message, additionalData, associations,
+ std::vector<std::string> additionalData_old{};
+ a(id, severity, timestamp, message, additionalData_old, associations,
resolved);
updateTimestamp = timestamp;
+ additionalData = util::additional_data::parse(additionalData_old);
}
else if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_UPDATE_TS))
{
- a(id, severity, timestamp, message, additionalData, associations,
+ std::vector<std::string> additionalData_old{};
+ a(id, severity, timestamp, message, additionalData_old, associations,
resolved, fwVersion);
updateTimestamp = timestamp;
+ additionalData = util::additional_data::parse(additionalData_old);
}
else if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_EVENTID))
{
- a(id, severity, timestamp, message, additionalData, associations,
+ std::vector<std::string> additionalData_old{};
+ a(id, severity, timestamp, message, additionalData_old, associations,
resolved, fwVersion, updateTimestamp);
+ additionalData = util::additional_data::parse(additionalData_old);
}
else if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_RESOLUTION))
{
- a(id, severity, timestamp, message, additionalData, associations,
+ std::vector<std::string> additionalData_old{};
+ a(id, severity, timestamp, message, additionalData_old, associations,
resolved, fwVersion, updateTimestamp, eventId);
+ additionalData = util::additional_data::parse(additionalData_old);
+ }
+ else if (version <
+ std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_METADATA_DICT))
+ {
+ std::vector<std::string> additionalData_old{};
+ a(id, severity, timestamp, message, additionalData_old, associations,
+ resolved, fwVersion, updateTimestamp, eventId, resolution);
+ additionalData = util::additional_data::parse(additionalData_old);
}
else
{
@@ -91,8 +108,8 @@
e.severity(severity, true);
e.timestamp(timestamp, true);
e.message(message, true);
- e.additionalData(additionalData, true);
- e.additionalData2(util::additional_data::parse(additionalData), true);
+ e.additionalData(util::additional_data::combine(additionalData), true);
+ e.additionalData2(additionalData, true);
e.sdbusplus::server::xyz::openbmc_project::logging::Entry::resolved(
resolved, true);
e.associations(associations, true);
diff --git a/test/serialization_test_properties.cpp b/test/serialization_test_properties.cpp
index d7d5455..60fc6ae 100644
--- a/test/serialization_test_properties.cpp
+++ b/test/serialization_test_properties.cpp
@@ -13,7 +13,7 @@
{
auto id = 99;
phosphor::logging::AssociationList assocations{};
- std::vector<std::string> testData{"additional", "data"};
+ std::vector<std::string> testData{"additional=1", "data=yes"};
uint64_t timestamp{100};
std::string message{"test error"};
std::string fwLevel{"level42"};