Simplify snapshot and WAL filenames
Reviewers: teon.banek, msantl Reviewed By: msantl Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1669
This commit is contained in:
parent
809e1779b1
commit
22824fd83c
@ -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<tx::TransactionId> TransactionIdFromWalFilename(
|
||||
const std::string &name) {
|
||||
auto nullopt = std::experimental::nullopt;
|
||||
if (utils::EndsWith(name, "current"))
|
||||
return std::numeric_limits<tx::TransactionId>::max();
|
||||
// Get the max_transaction_id from the file name that has format
|
||||
// "XXXXX__max_transaction_<MAX_TRANS_ID>"
|
||||
auto file_name_split = utils::RSplit(name, "__", 1);
|
||||
// "XXXXX_tx_<MAX_TRANS_ID>"
|
||||
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<tx::TransactionId>::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<tx::TransactionId> TransactionIdFromWalFilename(
|
||||
fs::path WalFilenameForTransactionId(
|
||||
const std::experimental::filesystem::path &wal_dir,
|
||||
std::experimental::optional<tx::TransactionId> 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<tx::TransactionId>
|
||||
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
|
||||
|
@ -58,16 +58,16 @@ class Timestamp : public TotalOrdering<Timestamp> {
|
||||
|
||||
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<Timestamp> {
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user