diff --git a/NEWS b/NEWS index d9193a27d..5226eb916 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,11 @@ ver 0.21 (not yet released) - sndio: new mixer plugin * require GCC 5.0 +ver 0.20.15 (not yet released) +* state file + - make mount point restore errors non-fatal + - fix crash when restoring mounts with incompatible database plugin + ver 0.20.14 (2018/01/01) * database - simple: fix file corruption in the presence of mount points diff --git a/src/storage/StorageState.cxx b/src/storage/StorageState.cxx index 990de4d80..9ca35caa6 100644 --- a/src/storage/StorageState.cxx +++ b/src/storage/StorageState.cxx @@ -47,6 +47,9 @@ static constexpr Domain storage_domain("storage"); void storage_state_save(BufferedOutputStream &os, const Instance &instance) { + if (instance.storage == nullptr) + return; + const auto visitor = [&os](const char *mount_uri, const Storage &storage) { std::string uri = storage.MapUTF8(""); if (uri.empty() || StringIsEmpty(mount_uri)) @@ -84,6 +87,12 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance) FormatError(storage_domain, "Unrecognized line in mountpoint state: %s", line); } + if (instance.storage == nullptr) + /* without storage (a CompositeStorage instance), we + cannot mount, and therefore we silently ignore the + state file */ + return true; + if (url.empty() || uri.empty()) { LogError(storage_domain, "Missing value in mountpoint state."); return true; @@ -98,16 +107,18 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance) return true; } -#ifdef ENABLE_DATABASE Database *db = instance.database; if (db != nullptr && db->IsPlugin(simple_db_plugin)) { try { ((SimpleDatabase *)db)->Mount(uri.c_str(), url.c_str()); } catch (...) { - throw; + delete storage; + FormatError(std::current_exception(), + "Failed to restore mount to %s", + url.c_str()); + return true; } } -#endif ((CompositeStorage*)instance.storage)->Mount(uri.c_str(), storage); @@ -117,6 +128,9 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance) unsigned storage_state_get_hash(const Instance &instance) { + if (instance.storage == nullptr) + return 0; + std::set mounts; const auto visitor = [&mounts](const char *mount_uri, const Storage &storage) {