From 7b8a016a9e1d047216f74a0042021b2fc2a80c9d Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 30 Jun 2022 01:32:32 +0300 Subject: [PATCH] Improve fatal error message. --- tddb/td/db/SqliteDb.cpp | 4 +++- tddb/td/db/SqliteDb.h | 2 -- tddb/td/db/detail/RawSqliteDb.cpp | 9 +++++++++ tddb/td/db/detail/RawSqliteDb.h | 2 ++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tddb/td/db/SqliteDb.cpp b/tddb/td/db/SqliteDb.cpp index e9267e045..fe107de81 100644 --- a/tddb/td/db/SqliteDb.cpp +++ b/tddb/td/db/SqliteDb.cpp @@ -76,7 +76,9 @@ Status SqliteDb::init(CSlice path, bool allow_creation) { auto database_stat = stat(path); if (database_stat.is_error()) { if (!allow_creation) { - LOG(FATAL) << "Database was deleted during execution and can't be recreated: " << database_stat.error(); + 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(); } TRY_STATUS(destroy(path)); } diff --git a/tddb/td/db/SqliteDb.h b/tddb/td/db/SqliteDb.h index f0e8e5989..7792adfcc 100644 --- a/tddb/td/db/SqliteDb.h +++ b/tddb/td/db/SqliteDb.h @@ -63,8 +63,6 @@ class SqliteDb { static Result change_key(CSlice path, bool allow_creation, const DbKey &new_db_key, const DbKey &old_db_key); - Status last_error(); - sqlite3 *get_native() const { return raw_->db(); } diff --git a/tddb/td/db/detail/RawSqliteDb.cpp b/tddb/td/db/detail/RawSqliteDb.cpp index a19ca3b48..eb6389eeb 100644 --- a/tddb/td/db/detail/RawSqliteDb.cpp +++ b/tddb/td/db/detail/RawSqliteDb.cpp @@ -14,9 +14,13 @@ #include "td/utils/port/path.h" #include "td/utils/port/Stat.h" +#include + namespace td { namespace detail { +static std::atomic was_database_destroyed{false}; + Status RawSqliteDb::last_error(sqlite3 *db, CSlice path) { return Status::Error(PSLICE() << Slice(sqlite3_errmsg(db)) << " for database \"" << path << '"'); } @@ -36,12 +40,17 @@ Status RawSqliteDb::last_error() { //If database was corrupted, try to delete it. auto code = sqlite3_errcode(db_); if (code == SQLITE_CORRUPT) { + was_database_destroyed.store(true, std::memory_order_relaxed); destroy(path_).ignore(); } return last_error(db_, path()); } +bool RawSqliteDb::was_any_database_destroyed() { + return was_database_destroyed.load(std::memory_order_relaxed); +} + RawSqliteDb::~RawSqliteDb() { auto rc = sqlite3_close(db_); LOG_IF(FATAL, rc != SQLITE_OK) << last_error(db_, path()); diff --git a/tddb/td/db/detail/RawSqliteDb.h b/tddb/td/db/detail/RawSqliteDb.h index 3c6628b45..ad67aa949 100644 --- a/tddb/td/db/detail/RawSqliteDb.h +++ b/tddb/td/db/detail/RawSqliteDb.h @@ -45,6 +45,8 @@ class RawSqliteDb { Status last_error(); static Status last_error(sqlite3 *db, CSlice path); + static bool was_any_database_destroyed(); + bool on_begin() { begin_cnt_++; return begin_cnt_ == 1;