diff --git a/src/database/dbms.hpp b/src/database/dbms.hpp index 2cf240bf0..e6e4c9a75 100644 --- a/src/database/dbms.hpp +++ b/src/database/dbms.hpp @@ -10,6 +10,7 @@ #include "database/graph_db.hpp" #include "database/graph_db_accessor.hpp" #include "durability/recovery.hpp" +#include "utils/exceptions.hpp" DECLARE_string(snapshot_directory); DECLARE_bool(recover_on_startup); @@ -39,13 +40,22 @@ namespace fs = std::experimental::filesystem; class Dbms { public: Dbms() { + auto snapshot_root_dir = fs::path(FLAGS_snapshot_directory); + if (fs::exists(snapshot_root_dir) && !fs::is_directory(snapshot_root_dir)) { + throw utils::BasicException("Specified snapshot directory is a file!"); + } + if (FLAGS_recover_on_startup) { - if (fs::exists(fs::path(FLAGS_snapshot_directory))) { + if (fs::exists(snapshot_root_dir)) { auto accessor = dbs.access(); - for (auto &snapshot_db : + for (auto &snapshot_db_dir : fs::directory_iterator(FLAGS_snapshot_directory)) { - // create db and set it active - active(snapshot_db.path().filename(), snapshot_db); + // The snapshot folder structure is: + // snapshot_root_dir/database_name/[timestamp] + if (fs::is_directory(snapshot_db_dir)) { + // Create db and set it active + active(snapshot_db_dir.path().filename(), snapshot_db_dir); + } } } } diff --git a/src/database/graph_db.cpp b/src/database/graph_db.cpp index 8a51fd0e7..d253921c2 100644 --- a/src/database/graph_db.cpp +++ b/src/database/graph_db.cpp @@ -71,8 +71,11 @@ void GraphDb::StartSnapshooting() { void GraphDb::RecoverDatabase(const fs::path &snapshot_db_dir) { if (snapshot_db_dir.empty()) return; std::vector snapshots; - for (auto &snapshot_file : fs::directory_iterator(snapshot_db_dir)) - snapshots.push_back(snapshot_file); + for (auto &snapshot_file : fs::directory_iterator(snapshot_db_dir)) { + if (fs::is_regular_file(snapshot_file)) { + snapshots.push_back(snapshot_file); + } + } std::sort(snapshots.rbegin(), snapshots.rend()); Recovery recovery;