]> granicus.if.org Git - icinga2/commitdiff
Fix problem with non-existing objects in config sync updates
authorMichael Friedrich <michael.friedrich@netways.de>
Wed, 30 Sep 2015 08:04:37 +0000 (10:04 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Wed, 30 Sep 2015 08:04:37 +0000 (10:04 +0200)
refs #9851
refs #9927
refs #9081

lib/remote/apilistener-configsync.cpp

index 9f904df5f8859de5114361132c6f5d32e30f17b7..ec6467346ac1ba1e2f91c49f2fb4d46247d0c3d8 100644 (file)
@@ -138,36 +138,40 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
                object->SetVersion(objVersion, false, origin);
        }
 
-       /* update object attributes if version was changed */
-       if (object && objVersion > object->GetVersion()) {
-               Log(LogInformation, "ApiListener")
-                   << "Processing config update for object '" << object->GetName()
-                   << "': Object version " << object->GetVersion()
-                   << " is older than the received version " << objVersion << ".";
-
-               Dictionary::Ptr modified_attributes = params->Get("modified_attributes");
-
-               if (modified_attributes) {
-                       ObjectLock olock(modified_attributes);
-                       BOOST_FOREACH(const Dictionary::Pair& kv, modified_attributes) {
-                               /* update all modified attributes
-                                * but do not update the object version yet.
-                                * This triggers cluster events otherwise.
-                                */
-                               object->ModifyAttribute(kv.first, kv.second, false);
-                       }
-               }
+       if (!object)
+               return Empty;
 
-               /* keep the object version in sync with the sender */
-               object->SetVersion(objVersion, false, origin);
-       } else {
+       /* update object attributes if version was changed */
+       if (objVersion <= object->GetVersion()) {
                Log(LogNotice, "ApiListener")
                    << "Discarding config update for object '" << object->GetName()
                    << "': Object version " << object->GetVersion()
                    << " is more recent than the received version " << objVersion << ".";
+
                return Empty;
        }
 
+       Log(LogNotice, "ApiListener")
+           << "Processing config update for object '" << object->GetName()
+           << "': Object version " << object->GetVersion()
+           << " is older than the received version " << objVersion << ".";
+
+       Dictionary::Ptr modified_attributes = params->Get("modified_attributes");
+
+       if (modified_attributes) {
+               ObjectLock olock(modified_attributes);
+               BOOST_FOREACH(const Dictionary::Pair& kv, modified_attributes) {
+                       /* update all modified attributes
+                        * but do not update the object version yet.
+                        * This triggers cluster events otherwise.
+                        */
+                       object->ModifyAttribute(kv.first, kv.second, false);
+               }
+       }
+
+       /* keep the object version in sync with the sender */
+       object->SetVersion(objVersion, false, origin);
+
        return Empty;
 }