aboutsummaryrefslogtreecommitdiffhomepage
path: root/tddb
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2022-06-30 01:32:32 +0300
committerlevlam <levlam@telegram.org>2022-06-30 01:32:32 +0300
commit7b8a016a9e1d047216f74a0042021b2fc2a80c9d (patch)
tree315c118eed73a5d859f8cc546bc6fb8aa3f4ef5b /tddb
parentcb559c396ddf9ef05654b99df04fe5da14755620 (diff)
Improve fatal error message.
Diffstat (limited to 'tddb')
-rw-r--r--tddb/td/db/SqliteDb.cpp4
-rw-r--r--tddb/td/db/SqliteDb.h2
-rw-r--r--tddb/td/db/detail/RawSqliteDb.cpp9
-rw-r--r--tddb/td/db/detail/RawSqliteDb.h2
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<SqliteDb> 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 <atomic>
+
namespace td {
namespace detail {
+static std::atomic<bool> 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;