Improve performance for ApiListener::RelayMessageOne

refs #11014
This commit is contained in:
Gunnar Beutner 2016-01-27 13:39:31 +01:00
parent f9efc2ffe7
commit 864cdee8d9
2 changed files with 9 additions and 7 deletions

View File

@ -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); ASSERT(targetZone);
bool is_master = IsMaster();
Endpoint::Ptr master = GetMaster();
Zone::Ptr myZone = Zone::GetLocalZone(); Zone::Ptr myZone = Zone::GetLocalZone();
/* only relay the message to a) the same zone, b) the parent zone and c) direct child zones */ /* 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) if (targetZone != myZone && targetZone != myZone->GetParent() && targetZone->GetParent() != myZone)
return true; return true;
Endpoint::Ptr myEndpoint = GetLocalEndpoint();
std::vector<Endpoint::Ptr> skippedEndpoints; std::vector<Endpoint::Ptr> skippedEndpoints;
bool relayed = false, log_needed = false, log_done = false; 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 */ /* 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); skippedEndpoints.push_back(endpoint);
continue; continue;
} }
@ -703,10 +703,12 @@ void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin,
if (!target_zone) if (!target_zone)
target_zone = Zone::GetLocalZone(); 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()) { BOOST_FOREACH(const Zone::Ptr& zone, target_zone->GetAllParents()) {
if (!RelayMessageOne(zone, origin, message)) if (!RelayMessageOne(zone, origin, message, master))
need_log = true; need_log = true;
} }

View File

@ -128,7 +128,7 @@ private:
Stream::Ptr m_LogFile; Stream::Ptr m_LogFile;
size_t m_LogMessageCount; 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 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); void PersistMessage(const Dictionary::Ptr& message, const ConfigObject::Ptr& secobj);