From 894f22fba0eade5b5bfe690cc7fd19b78f8d6b8d Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Fri, 16 May 2025 13:39:34 -0500 Subject: [PATCH] [Fix] Deadlock on failed #copycharacter commands (#4887) --- common/database.cpp | 20 +++++++++++++++++++- common/dbcore.cpp | 4 ++-- common/dbcore.h | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/common/database.cpp b/common/database.cpp index 74596df23..c79ae0117 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -1920,6 +1920,7 @@ bool Database::CopyCharacter( std::vector tables_to_zero_id = { "keyring", "data_buckets", + "character_evolving_items", "character_instance_safereturns", "character_expedition_lockouts", "character_instance_lockouts", @@ -1951,6 +1952,12 @@ bool Database::CopyCharacter( ) ); + if (!results.Success()) { + LogError("Transaction failed [{}] rolling back", results.ErrorMessage()); + TransactionRollback(); + return false; + } + std::vector columns = {}; int column_count = 0; @@ -1969,6 +1976,12 @@ bool Database::CopyCharacter( ) ); + if (!results.Success()) { + LogError("Transaction failed [{}] rolling back", results.ErrorMessage()); + TransactionRollback(); + return false; + } + std::vector> new_rows; for (auto row : results) { @@ -2036,13 +2049,18 @@ bool Database::CopyCharacter( LogInfo("Copying table [{}] rows [{}]", table_name, Strings::Commify(rows_copied)); if (!insert.ErrorMessage().empty()) { + LogError("Error copying table [{}] [{}]", table_name, insert.ErrorMessage()); TransactionRollback(); return false; } } } - TransactionCommit(); + auto r = TransactionCommit(); + if (!r.Success()) { + LogError("Transaction failed [{}] rolling back", r.ErrorMessage()); + return false; + } LogInfo( "Character [{}] copied to [{}] total rows [{}]", diff --git a/common/dbcore.cpp b/common/dbcore.cpp index 1c0911866..a6117cfd2 100644 --- a/common/dbcore.cpp +++ b/common/dbcore.cpp @@ -189,9 +189,9 @@ void DBcore::TransactionBegin() QueryDatabase("START TRANSACTION"); } -void DBcore::TransactionCommit() +MySQLRequestResult DBcore::TransactionCommit() { - QueryDatabase("COMMIT"); + return QueryDatabase("COMMIT"); } void DBcore::TransactionRollback() diff --git a/common/dbcore.h b/common/dbcore.h index cefdc6522..6d07f1bdb 100644 --- a/common/dbcore.h +++ b/common/dbcore.h @@ -32,7 +32,7 @@ public: MySQLRequestResult QueryDatabase(const std::string& query, bool retryOnFailureOnce = true); MySQLRequestResult QueryDatabaseMulti(const std::string &query); void TransactionBegin(); - void TransactionCommit(); + MySQLRequestResult TransactionCommit(); void TransactionRollback(); std::string Escape(const std::string& s); uint32 DoEscapeString(char *tobuf, const char *frombuf, uint32 fromlen);