mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 07:54:05 +01:00
ircd::db: Add error report state w/ interface w/ console cmd.
This commit is contained in:
parent
0f7e17a519
commit
5dcc7cd93b
3 changed files with 88 additions and 7 deletions
|
@ -19,6 +19,7 @@ namespace ircd::db
|
||||||
const std::string &name(const database &);
|
const std::string &name(const database &);
|
||||||
const std::string &uuid(const database &);
|
const std::string &uuid(const database &);
|
||||||
uint64_t sequence(const database &); // Latest sequence number
|
uint64_t sequence(const database &); // Latest sequence number
|
||||||
|
const std::vector<std::string> &errors(const database &);
|
||||||
std::vector<std::string> files(const database &, uint64_t &msz);
|
std::vector<std::string> files(const database &, uint64_t &msz);
|
||||||
std::vector<std::string> files(const database &);
|
std::vector<std::string> files(const database &);
|
||||||
size_t file_count(const database &);
|
size_t file_count(const database &);
|
||||||
|
@ -100,6 +101,7 @@ struct ircd::db::database
|
||||||
std::list<std::shared_ptr<column>> columns; // active only
|
std::list<std::shared_ptr<column>> columns; // active only
|
||||||
std::string uuid;
|
std::string uuid;
|
||||||
std::unique_ptr<rocksdb::Checkpoint> checkpointer;
|
std::unique_ptr<rocksdb::Checkpoint> checkpointer;
|
||||||
|
std::vector<std::string> errors;
|
||||||
|
|
||||||
operator std::shared_ptr<database>() { return shared_from_this(); }
|
operator std::shared_ptr<database>() { return shared_from_this(); }
|
||||||
operator const rocksdb::DB &() const { return *d; }
|
operator const rocksdb::DB &() const { return *d; }
|
||||||
|
|
48
ircd/db.cc
48
ircd/db.cc
|
@ -379,10 +379,16 @@ ircd::db::resume(database &d)
|
||||||
assert(d.d);
|
assert(d.d);
|
||||||
const ctx::uninterruptible::nothrow ui;
|
const ctx::uninterruptible::nothrow ui;
|
||||||
const std::lock_guard<decltype(write_mutex)> lock{write_mutex};
|
const std::lock_guard<decltype(write_mutex)> lock{write_mutex};
|
||||||
|
const auto errors
|
||||||
|
{
|
||||||
|
db::errors(d)
|
||||||
|
};
|
||||||
|
|
||||||
log::debug
|
log::debug
|
||||||
{
|
{
|
||||||
log, "'%s': Attempting to resume @%lu",
|
log, "'%s': Attempting to resume from %zu errors @%lu",
|
||||||
name(d),
|
name(d),
|
||||||
|
errors.size(),
|
||||||
sequence(d)
|
sequence(d)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -391,11 +397,14 @@ ircd::db::resume(database &d)
|
||||||
d.d->Resume()
|
d.d->Resume()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
d.errors.clear();
|
||||||
|
|
||||||
log::info
|
log::info
|
||||||
{
|
{
|
||||||
log, "'%s': Resumed normal operation at sequence number %lu.",
|
log, "'%s': Resumed normal operation at sequence number %lu; cleared %zu errors",
|
||||||
name(d),
|
name(d),
|
||||||
sequence(d)
|
sequence(d),
|
||||||
|
errors.size()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,6 +546,12 @@ ircd::db::files(const database &cd,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<std::string> &
|
||||||
|
ircd::db::errors(const database &d)
|
||||||
|
{
|
||||||
|
return d.errors;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t
|
uint64_t
|
||||||
ircd::db::sequence(const database &cd)
|
ircd::db::sequence(const database &cd)
|
||||||
{
|
{
|
||||||
|
@ -2371,15 +2386,17 @@ ircd::db::database::events::OnBackgroundError(rocksdb::BackgroundErrorReason rea
|
||||||
rocksdb::Status *const status)
|
rocksdb::Status *const status)
|
||||||
noexcept
|
noexcept
|
||||||
{
|
{
|
||||||
|
assert(d);
|
||||||
assert(status);
|
assert(status);
|
||||||
log::error
|
|
||||||
|
thread_local char buf[1024];
|
||||||
|
const string_view str{fmt::sprintf
|
||||||
{
|
{
|
||||||
rog, "'%s' background %s error in %s :%s",
|
buf, "%s error in %s :%s",
|
||||||
d->name,
|
|
||||||
reflect(status->severity()),
|
reflect(status->severity()),
|
||||||
reflect(reason),
|
reflect(reason),
|
||||||
status->ToString()
|
status->ToString()
|
||||||
};
|
}};
|
||||||
|
|
||||||
// This is a legitimate when we want to use it. If the error is not
|
// This is a legitimate when we want to use it. If the error is not
|
||||||
// suppressed the DB will enter read-only mode and will require a
|
// suppressed the DB will enter read-only mode and will require a
|
||||||
|
@ -2389,8 +2406,25 @@ noexcept
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const log::facility fac
|
||||||
|
{
|
||||||
|
ignore?
|
||||||
|
log::facility::DERROR:
|
||||||
|
log::facility::ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
log::logf
|
||||||
|
{
|
||||||
|
log, fac, "'%s': %s", d->name, str
|
||||||
|
};
|
||||||
|
|
||||||
if(ignore)
|
if(ignore)
|
||||||
|
{
|
||||||
*status = rocksdb::Status::OK();
|
*status = rocksdb::Status::OK();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->errors.emplace_back(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -1352,6 +1352,42 @@ catch(const std::out_of_range &e)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
console_cmd__db__errors(opt &out, const string_view &line)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const params param{line, " ",
|
||||||
|
{
|
||||||
|
"dbname",
|
||||||
|
}};
|
||||||
|
|
||||||
|
const auto dbname
|
||||||
|
{
|
||||||
|
param.at("dbname")
|
||||||
|
};
|
||||||
|
|
||||||
|
auto &database
|
||||||
|
{
|
||||||
|
db::database::get(dbname)
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto &errors
|
||||||
|
{
|
||||||
|
db::errors(database)
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t i(0);
|
||||||
|
for(const auto &error : errors)
|
||||||
|
out << std::setw(2) << std::left << (i++) << ':' << error << std::endl;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch(const std::out_of_range &e)
|
||||||
|
{
|
||||||
|
out << "No open database by that name" << std::endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
console_cmd__db__ticker(opt &out, const string_view &line)
|
console_cmd__db__ticker(opt &out, const string_view &line)
|
||||||
try
|
try
|
||||||
|
@ -2930,6 +2966,15 @@ try
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!c && !errors(d).empty())
|
||||||
|
{
|
||||||
|
size_t i(0);
|
||||||
|
out << std::endl;
|
||||||
|
out << "ERRORS (" << errors(d).size() << "): " << std::endl;
|
||||||
|
for(const auto &error : errors(d))
|
||||||
|
out << std::setw(2) << (i++) << ':' << error << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch(const std::out_of_range &e)
|
catch(const std::out_of_range &e)
|
||||||
|
|
Loading…
Reference in a new issue