diff --git a/lib/base/application.cpp b/lib/base/application.cpp index a939db446..880af34a2 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -353,6 +353,11 @@ bool Application::IsShuttingDown() return m_ShuttingDown; } +bool Application::IsRestarting() +{ + return l_Restarting; +} + void Application::OnShutdown() { /* Nothing to do here. */ diff --git a/lib/base/application.hpp b/lib/base/application.hpp index ceab4441e..92f627e75 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -58,6 +58,7 @@ public: static void RequestReopenLogs(); static bool IsShuttingDown(); + static bool IsRestarting(); static void SetDebuggingSeverity(LogSeverity severity); static LogSeverity GetDebuggingSeverity(); diff --git a/lib/db_ido/dbconnection.cpp b/lib/db_ido/dbconnection.cpp index d86efa596..0265dad05 100644 --- a/lib/db_ido/dbconnection.cpp +++ b/lib/db_ido/dbconnection.cpp @@ -375,7 +375,26 @@ bool DbConnection::GetStatusUpdate(const DbObject::Ptr& dbobj) const void DbConnection::UpdateObject(const ConfigObject::Ptr& object) { - if (!GetConnected() || Application::IsShuttingDown()) + bool isShuttingDown = Application::IsShuttingDown(); + bool isRestarting = Application::IsRestarting(); + +#ifdef I2_DEBUG + if (isShuttingDown || isRestarting) { + //Log(LogDebug, "DbConnection") + // << "Updating object '" << object->GetName() << "' \t\t active '" << Convert::ToLong(object->IsActive()) + // << "' shutting down '" << Convert::ToLong(isShuttingDown) << "' restarting '" << Convert::ToLong(isRestarting) << "'."; + } +#endif /* I2_DEBUG */ + + /* Wait until a database connection is established on reconnect. */ + if (!GetConnected()) + return; + + /* Don't update inactive objects during shutdown/reload/restart. + * They would be marked as deleted. This gets triggered with ConfigObject::StopObjects(). + * During startup/reconnect this is fine, the handler is not active there. + */ + if (isShuttingDown || isRestarting) return; DbObject::Ptr dbobj = DbObject::GetOrCreateByObject(object); @@ -402,7 +421,10 @@ void DbConnection::UpdateObject(const ConfigObject::Ptr& object) dbobj->SendConfigUpdateLight(); } } else if (!active) { - /* Deactivate the deleted object no matter + /* This may happen on reload/restart actions too + * and is blocked above already. + * + * Deactivate the deleted object no matter * which state it had in the database. */ DeactivateObject(dbobj);