From 78e24c53f1564269f744de5efe50cb099cadbdde Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 3 May 2019 12:44:29 +0200 Subject: [PATCH] DB IDO: Do not deactivate objects during application reload/restart This follows the same principle as with the shutdown handler, and was introduced with the changed reload handling with 2.9. Previously IsShuttingDown() was sufficient which got set at one location. SigUsr2 as handler introduced a new location where m_ShuttingDown is not necessarily set yet. Since this handler gets called when l_Restarting is enabled, we'll use this flag to avoid config update events resulting in object deactivation (object->IsActive() always returns false). refs #5996 refs #6691 refs #6970 fixes #7125 --- lib/base/application.cpp | 5 +++++ lib/base/application.hpp | 1 + lib/db_ido/dbconnection.cpp | 26 ++++++++++++++++++++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) 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); -- 2.40.0