From 864cdee8d957d89cf82716fca01ea9c52cedfeae Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 27 Jan 2016 13:39:31 +0100 Subject: [PATCH] Improve performance for ApiListener::RelayMessageOne refs #11014 --- lib/remote/apilistener.cpp | 14 ++++++++------ lib/remote/apilistener.hpp | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 0a3eb3149..338d1c869 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -607,18 +607,18 @@ void ApiListener::SyncSendMessage(const Endpoint::Ptr& endpoint, const Dictionar } } -bool ApiListener::RelayMessageOne(const Zone::Ptr& targetZone, const MessageOrigin::Ptr& origin, const Dictionary::Ptr& message) +bool ApiListener::RelayMessageOne(const Zone::Ptr& targetZone, const MessageOrigin::Ptr& origin, const Dictionary::Ptr& message, const Endpoint::Ptr& currentMaster) { ASSERT(targetZone); - bool is_master = IsMaster(); - Endpoint::Ptr master = GetMaster(); Zone::Ptr myZone = Zone::GetLocalZone(); /* only relay the message to a) the same zone, b) the parent zone and c) direct child zones */ if (targetZone != myZone && targetZone != myZone->GetParent() && targetZone->GetParent() != myZone) return true; + Endpoint::Ptr myEndpoint = GetLocalEndpoint(); + std::vector skippedEndpoints; bool relayed = false, log_needed = false, log_done = false; @@ -659,7 +659,7 @@ bool ApiListener::RelayMessageOne(const Zone::Ptr& targetZone, const MessageOrig } /* only relay message to the master if we're not currently the master */ - if (!is_master && master != endpoint) { + if (currentMaster != myEndpoint && currentMaster != endpoint) { skippedEndpoints.push_back(endpoint); continue; } @@ -703,10 +703,12 @@ void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin, if (!target_zone) target_zone = Zone::GetLocalZone(); - bool need_log = !RelayMessageOne(target_zone, origin, message); + Endpoint::Ptr master = GetMaster(); + + bool need_log = !RelayMessageOne(target_zone, origin, message, master); BOOST_FOREACH(const Zone::Ptr& zone, target_zone->GetAllParents()) { - if (!RelayMessageOne(zone, origin, message)) + if (!RelayMessageOne(zone, origin, message, master)) need_log = true; } diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 5fcbea3b1..bfc2f2d7a 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -128,7 +128,7 @@ private: Stream::Ptr m_LogFile; size_t m_LogMessageCount; - bool RelayMessageOne(const Zone::Ptr& zone, const MessageOrigin::Ptr& origin, const Dictionary::Ptr& message); + bool RelayMessageOne(const Zone::Ptr& zone, const MessageOrigin::Ptr& origin, const Dictionary::Ptr& message, const Endpoint::Ptr& currentMaster); void SyncRelayMessage(const MessageOrigin::Ptr& origin, const ConfigObject::Ptr& secobj, const Dictionary::Ptr& message, bool log); void PersistMessage(const Dictionary::Ptr& message, const ConfigObject::Ptr& secobj);