diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index a29b73773..7e1e3c52c 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -511,9 +511,6 @@ void ApiListener::SyncRelayMessage(const MessageOrigin& origin, const DynamicObj Log(LogNotice, "ApiListener") << "Relaying '" << message->Get("method") << "' message"; - if (log) - PersistMessage(message, secobj); - if (origin.FromZone) message->Set("originZone", origin.FromZone->GetName()); @@ -522,15 +519,31 @@ void ApiListener::SyncRelayMessage(const MessageOrigin& origin, const DynamicObj Zone::Ptr my_zone = Zone::GetLocalZone(); std::vector skippedEndpoints; + std::set allZones; std::set finishedZones; + std::set finishedLogZones; BOOST_FOREACH(const Endpoint::Ptr& endpoint, DynamicType::GetObjectsByType()) { - /* 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); @@ -562,15 +575,14 @@ void ApiListener::SyncRelayMessage(const MessageOrigin& origin, const DynamicObj 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); }