]> granicus.if.org Git - icinga2/commitdiff
DB IDO: Do not deactivate objects during application reload/restart 7157/head
authorMichael Friedrich <michael.friedrich@icinga.com>
Fri, 3 May 2019 10:44:29 +0000 (12:44 +0200)
committerMichael Friedrich <michael.friedrich@icinga.com>
Fri, 3 May 2019 13:40:48 +0000 (15:40 +0200)
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
lib/base/application.hpp
lib/db_ido/dbconnection.cpp

index a939db4464314b7215cbf5d44005b20b9a6e96e0..880af34a24ea0c250def67d40c3097248f3e6ebd 100644 (file)
@@ -353,6 +353,11 @@ bool Application::IsShuttingDown()
        return m_ShuttingDown;
 }
 
+bool Application::IsRestarting()
+{
+       return l_Restarting;
+}
+
 void Application::OnShutdown()
 {
        /* Nothing to do here. */
index ceab4441ef3d272e3a994bc91d95748c4817426f..92f627e75c4c2d34c5a55ad17f5098d51d4d618d 100644 (file)
@@ -58,6 +58,7 @@ public:
        static void RequestReopenLogs();
 
        static bool IsShuttingDown();
+       static bool IsRestarting();
 
        static void SetDebuggingSeverity(LogSeverity severity);
        static LogSeverity GetDebuggingSeverity();
index d86efa59638b7a399da0a58daa8268be84c5a73a..0265dad05075386dff5f517d5dcddb6ee60281d6 100644 (file)
@@ -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);