]> granicus.if.org Git - icinga2/commitdiff
Don't log messages we've already relayed to all relevant zones
authorGunnar Beutner <gunnar@beutner.name>
Thu, 1 Oct 2015 07:17:23 +0000 (09:17 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Thu, 1 Oct 2015 12:53:28 +0000 (14:53 +0200)
fixes #10262

lib/remote/apilistener.cpp

index c14abacc748f27d46ace7f0c078e4ebd54898694..a5449181fec0183b4d4ff893be37c6388369eeed 100644 (file)
@@ -584,9 +584,6 @@ void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin,
        Log(LogNotice, "ApiListener")
            << "Relaying '" << message->Get("method") << "' message";
 
-       if (log)
-               PersistMessage(message, secobj);
-
        if (origin && origin->FromZone)
                message->Set("originZone", origin->FromZone->GetName());
 
@@ -595,15 +592,31 @@ void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin,
        Zone::Ptr my_zone = Zone::GetLocalZone();
 
        std::vector<Endpoint::Ptr> skippedEndpoints;
+       std::set<Zone::Ptr> allZones;
        std::set<Zone::Ptr> finishedZones;
+       std::set<Zone::Ptr> finishedLogZones;
 
        BOOST_FOREACH(const Endpoint::Ptr& endpoint, ConfigType::GetObjectsByType<Endpoint>()) {
-               /* don't relay messages to ourselves or disconnected endpoints */
-               if (endpoint->GetName() == GetIdentity() || !endpoint->IsConnected())
+               /* don't relay messages to ourselves */
+               if (endpoint->GetName() == GetIdentity())
                        continue;
 
                Zone::Ptr target_zone = endpoint->GetZone();
 
+               allZones.insert(target_zone);
+
+               /* only relay messages to zones which have access to the object */
+               if (!target_zone->CanAccessObject(secobj)) {
+                       finishedLogZones.insert(target_zone);
+                       continue;
+               }
+
+               /* don't relay messages to disconnected endpoints */
+               if (!endpoint->IsConnected())
+                       continue;
+
+               finishedLogZones.insert(target_zone);
+
                /* don't relay the message to the zone through more than one endpoint */
                if (finishedZones.find(target_zone) != finishedZones.end()) {
                        skippedEndpoints.push_back(endpoint);
@@ -635,15 +648,14 @@ void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin,
                        continue;
                }
 
-               /* only relay messages to zones which have access to the object */
-               if (!target_zone->CanAccessObject(secobj))
-                       continue;
-
                finishedZones.insert(target_zone);
 
                SyncSendMessage(endpoint, message);
        }
 
+       if (log && allZones.size() != finishedLogZones.size())
+               PersistMessage(message, secobj);
+
        BOOST_FOREACH(const Endpoint::Ptr& endpoint, skippedEndpoints)
                endpoint->SetLocalLogPosition(ts);
 }