Add close state to fatal error message.

This commit is contained in:
levlam 2022-07-30 12:33:57 +03:00
parent e40fbde299
commit eced652ca6
3 changed files with 8 additions and 3 deletions

View File

@ -14,10 +14,11 @@ namespace td {
SqliteConnectionSafe::SqliteConnectionSafe(string path, DbKey key, optional<int32> cipher_version)
: path_(std::move(path))
, lsls_connection_([path = path_, key = std::move(key), cipher_version = std::move(cipher_version)] {
, lsls_connection_([path = path_, close_state_ptr = &close_state_, key = std::move(key),
cipher_version = std::move(cipher_version)] {
auto r_db = SqliteDb::open_with_key(path, false, key, cipher_version.copy());
if (r_db.is_error()) {
LOG(FATAL) << "Can't open database: " << r_db.error().message();
LOG(FATAL) << "Can't open database in state " << *close_state_ptr << ": " << r_db.error().message();
}
auto db = r_db.move_as_ok();
db.exec("PRAGMA journal_mode=WAL").ensure();
@ -36,12 +37,14 @@ SqliteDb &SqliteConnectionSafe::get() {
void SqliteConnectionSafe::close() {
LOG(INFO) << "Close SQLite database " << tag("path", path_);
close_state_++;
lsls_connection_.clear_values();
}
void SqliteConnectionSafe::close_and_destroy() {
close();
LOG(INFO) << "Destroy SQLite database " << tag("path", path_);
close_state_ += 65536;
SqliteDb::destroy(path_).ignore();
}

View File

@ -30,6 +30,7 @@ class SqliteConnectionSafe {
private:
string path_;
uint32 close_state_ = 0;
LazySchedulerLocalStorage<SqliteDb> lsls_connection_;
};

View File

@ -78,7 +78,8 @@ Status SqliteDb::init(CSlice path, bool allow_creation) {
if (!allow_creation) {
bool was_destroyed = detail::RawSqliteDb::was_any_database_destroyed();
auto reason = was_destroyed ? Slice("was corrupted and deleted") : Slice("disappeared");
LOG(FATAL) << "Database " << reason << " during execution and can't be recreated: " << database_stat.error();
return Status::Error(PSLICE() << "Database " << reason
<< " during execution and can't be recreated: " << database_stat.error());
}
TRY_STATUS(destroy(path));
}