Commit 28c5e7e6 authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.20.x'

parents dbfc4abf ff624075
......@@ -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
......
......@@ -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<std::string> mounts;
const auto visitor = [&mounts](const char *mount_uri, const Storage &storage) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment