From bc5fb40867a1f1c2e9bb4e7933e3ccb5f43c1f79 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Tue, 17 Nov 2009 12:38:13 +0300 Subject: [PATCH] [8825] At fail start db connections stop all started db connection threads. This will restore state before start Db function call and prevent crashes at delayed access to log singleton in case outdated DB structure detection. --- src/mangosd/Master.cpp | 34 ++++++++++++++++++++++++++++++++++ src/realmd/Main.cpp | 4 ++++ src/shared/revision_nr.h | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp index 56dd504d6..8e4daa9b4 100644 --- a/src/mangosd/Master.cpp +++ b/src/mangosd/Master.cpp @@ -414,12 +414,19 @@ bool Master::_StartDB() } if(!WorldDatabase.CheckRequiredField("db_version",REVISION_DB_MANGOS)) + { + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); return false; + } dbstring = sConfig.GetStringDefault("CharacterDatabaseInfo", ""); if(dbstring.empty()) { sLog.outError("Character Database not specified in configuration file"); + + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); return false; } sLog.outString("Character Database: %s", dbstring.c_str()); @@ -428,17 +435,29 @@ bool Master::_StartDB() if(!CharacterDatabase.Initialize(dbstring.c_str())) { sLog.outError("Cannot connect to Character database %s",dbstring.c_str()); + + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); return false; } if(!CharacterDatabase.CheckRequiredField("character_db_version",REVISION_DB_CHARACTERS)) + { + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); + CharacterDatabase.HaltDelayThread(); return false; + } ///- Get login database info from configuration file dbstring = sConfig.GetStringDefault("LoginDatabaseInfo", ""); if(dbstring.empty()) { sLog.outError("Login database not specified in configuration file"); + + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); + CharacterDatabase.HaltDelayThread(); return false; } @@ -447,17 +466,32 @@ bool Master::_StartDB() if(!loginDatabase.Initialize(dbstring.c_str())) { sLog.outError("Cannot connect to login database %s",dbstring.c_str()); + + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); + CharacterDatabase.HaltDelayThread(); return false; } if(!loginDatabase.CheckRequiredField("realmd_db_version",REVISION_DB_REALMD)) + { + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); + CharacterDatabase.HaltDelayThread(); + loginDatabase.HaltDelayThread(); return false; + } ///- Get the realm Id from the configuration file realmID = sConfig.GetIntDefault("RealmID", 0); if(!realmID) { sLog.outError("Realm ID not defined in configuration file"); + + ///- Wait for already started DB delay threads to end + WorldDatabase.HaltDelayThread(); + CharacterDatabase.HaltDelayThread(); + loginDatabase.HaltDelayThread(); return false; } diff --git a/src/realmd/Main.cpp b/src/realmd/Main.cpp index c25d827d1..c1be328c9 100644 --- a/src/realmd/Main.cpp +++ b/src/realmd/Main.cpp @@ -332,7 +332,11 @@ bool StartDB() } if(!loginDatabase.CheckRequiredField("realmd_db_version",REVISION_DB_REALMD)) + { + ///- Wait for already started DB delay threads to end + loginDatabase.HaltDelayThread(); return false; + } return true; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 4578afef2..8dad645a8 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8824" + #define REVISION_NR "8825" #endif // __REVISION_NR_H__