From 22824fd83c867cf2c6bd07d4d7124b40771a237f Mon Sep 17 00:00:00 2001 From: Matej Ferencevic Date: Wed, 17 Oct 2018 14:03:54 +0200 Subject: [PATCH] Simplify snapshot and WAL filenames Reviewers: teon.banek, msantl Reviewed By: msantl Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1669 --- src/durability/single_node/paths.cpp | 50 +++++++++++++++------------- src/utils/timestamp.hpp | 8 ++--- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/durability/single_node/paths.cpp b/src/durability/single_node/paths.cpp index 6a85cd40f..122b9c7c5 100644 --- a/src/durability/single_node/paths.cpp +++ b/src/durability/single_node/paths.cpp @@ -14,32 +14,34 @@ namespace durability { namespace fs = std::experimental::filesystem; +// This is the prefix used for WAL and Snapshot filenames. It is a timestamp +// format that equals to: YYYYmmddHHMMSSffffff +const std::string kTimestampFormat = + "{:04d}{:02d}{:02d}{:02d}{:02d}{:02d}{:06d}"; + +// TODO: This shouldn't be used to get the transaction ID from a WAL file, +// instead the file should be parsed and the transaction ID should be read from +// the file. std::experimental::optional TransactionIdFromWalFilename( const std::string &name) { - auto nullopt = std::experimental::nullopt; + if (utils::EndsWith(name, "current")) + return std::numeric_limits::max(); // Get the max_transaction_id from the file name that has format - // "XXXXX__max_transaction_" - auto file_name_split = utils::RSplit(name, "__", 1); + // "XXXXX_tx_" + auto file_name_split = utils::RSplit(name, "_", 1); if (file_name_split.size() != 2) { LOG(WARNING) << "Unable to parse WAL file name: " << name; - return nullopt; + return std::experimental::nullopt; } - if (utils::StartsWith(file_name_split[1], "current")) - return std::numeric_limits::max(); - file_name_split = utils::Split(file_name_split[1], "_"); - if (file_name_split.size() != 3) { - LOG(WARNING) << "Unable to parse WAL file name: " << name; - return nullopt; - } - auto &tx_id_str = file_name_split[2]; + auto &tx_id_str = file_name_split[1]; try { return std::stoll(tx_id_str); } catch (std::invalid_argument &) { LOG(WARNING) << "Unable to parse WAL file name tx ID: " << tx_id_str; - return nullopt; + return std::experimental::nullopt; } catch (std::out_of_range &) { LOG(WARNING) << "WAL file name tx ID too large: " << tx_id_str; - return nullopt; + return std::experimental::nullopt; } } @@ -49,42 +51,42 @@ std::experimental::optional TransactionIdFromWalFilename( fs::path WalFilenameForTransactionId( const std::experimental::filesystem::path &wal_dir, std::experimental::optional tx_id) { - auto file_name = utils::Timestamp::Now().ToIso8601(); + auto file_name = utils::Timestamp::Now().ToString(kTimestampFormat); if (tx_id) { - file_name += "__max_transaction_" + std::to_string(*tx_id); + file_name += "_tx_" + std::to_string(*tx_id); } else { - file_name += "__current"; + file_name += "_current"; } return wal_dir / file_name; } fs::path MakeSnapshotPath(const fs::path &durability_dir, tx::TransactionId tx_id) { - std::string date_str = - utils::Timestamp(utils::Timestamp::Now()) - .ToString("{:04d}_{:02d}_{:02d}__{:02d}_{:02d}_{:02d}_{:05d}"); + std::string date_str = utils::Timestamp::Now().ToString(kTimestampFormat); auto file_name = date_str + "_tx_" + std::to_string(tx_id); return durability_dir / kSnapshotDir / file_name; } +// TODO: This shouldn't be used to get the transaction ID from a snapshot file, +// instead the file should be parsed and the transaction ID should be read from +// the file. std::experimental::optional TransactionIdFromSnapshotFilename(const std::string &name) { - auto nullopt = std::experimental::nullopt; auto file_name_split = utils::RSplit(name, "_tx_", 1); if (file_name_split.size() != 2) { LOG(WARNING) << "Unable to parse snapshot file name: " << name; - return nullopt; + return std::experimental::nullopt; } try { return std::stoll(file_name_split[1]); } catch (std::invalid_argument &) { LOG(WARNING) << "Unable to parse snapshot file name tx ID: " << file_name_split[1]; - return nullopt; + return std::experimental::nullopt; } catch (std::out_of_range &) { LOG(WARNING) << "Unable to parse snapshot file name tx ID: " << file_name_split[1]; - return nullopt; + return std::experimental::nullopt; } } } // namespace durability diff --git a/src/utils/timestamp.hpp b/src/utils/timestamp.hpp index 29d0e8666..df42be256 100644 --- a/src/utils/timestamp.hpp +++ b/src/utils/timestamp.hpp @@ -58,16 +58,16 @@ class Timestamp : public TotalOrdering { long Sec() const { return time.tm_sec; } - long Subsec() const { return nsec / 10000; } + long Usec() const { return nsec / 1000; } const std::string ToIso8601() const { return fmt::format(fiso8601, Year(), Month(), Day(), Hour(), Min(), Sec(), - Subsec()); + Usec()); } const std::string ToString(const std::string &format = fiso8601) const { return fmt::format(format, Year(), Month(), Day(), Hour(), Min(), Sec(), - Subsec()); + Usec()); } friend std::ostream &operator<<(std::ostream &stream, const Timestamp &ts) { @@ -93,7 +93,7 @@ class Timestamp : public TotalOrdering { long nsec; static constexpr auto fiso8601 = - "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}.{:05d}Z"; + "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}.{:06d}Z"; }; } // namespace utils