From 759aba8a0da950c2f67501e5ee430ddb3100c64a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 11 Oct 2016 10:53:51 +0200 Subject: [PATCH] Fix object resync issues refs #11684 --- lib/remote/apilistener-configsync.cpp | 26 +++++++++++++++++++++----- lib/remote/apilistener.cpp | 6 ++++++ lib/remote/apilistener.hpp | 1 + 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/remote/apilistener-configsync.cpp b/lib/remote/apilistener-configsync.cpp index d72fd715b68..beeedb8d583 100644 --- a/lib/remote/apilistener-configsync.cpp +++ b/lib/remote/apilistener-configsync.cpp @@ -107,7 +107,11 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin String config = params->Get("config"); + bool newObject = false; + if (!object && !config.IsEmpty()) { + newObject = true; + /* object does not exist, create it through the API */ Array::Ptr errors = new Array(); @@ -136,8 +140,8 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin if (!object) return Empty; - /* update object attributes if version was changed */ - if (objVersion <= object->GetVersion()) { + /* update object attributes if version was changed or if this is a new object */ + if (newObject || objVersion <= object->GetVersion()) { Log(LogNotice, "ApiListener") << "Discarding config update for object '" << object->GetName() << "': Object version " << std::fixed << object->GetVersion() @@ -337,8 +341,14 @@ void ApiListener::UpdateConfigObject(const ConfigObject::Ptr& object, const Mess if (client) JsonRpc::SendMessage(client->GetStream(), message); - else + else { + Zone::Ptr target = static_pointer_cast(object->GetZone()); + + if (!target) + target = Zone::GetLocalZone(); + RelayMessage(origin, object, message, false); + } } @@ -379,8 +389,14 @@ void ApiListener::DeleteConfigObject(const ConfigObject::Ptr& object, const Mess if (client) JsonRpc::SendMessage(client->GetStream(), message); - else - RelayMessage(origin, object, message, false); + else { + Zone::Ptr target = static_pointer_cast(object->GetZone()); + + if (!target) + target = Zone::GetLocalZone(); + + RelayMessage(origin, target, message, false); + } } /* Initial sync on connect for new endpoints */ diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 8ade19fff1b..c76f63ec960 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -164,6 +164,12 @@ void ApiListener::Start(bool runtimeCreated) OnMasterChanged(true); } +void ApiListener::Stop(bool runtimeDeleted) +{ + boost::mutex::scoped_lock lock(m_LogLock); + CloseLogFile(); +} + ApiListener::Ptr ApiListener::GetInstance(void) { return m_Instance; diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index cbfbbd15016..2b2df11784a 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -104,6 +104,7 @@ class I2_REMOTE_API ApiListener : public ObjectImpl virtual void OnConfigLoaded(void) override; virtual void OnAllConfigLoaded(void) override; virtual void Start(bool runtimeCreated) override; + virtual void Stop(bool runtimeDeleted) override; virtual void ValidateTlsProtocolmin(const String& value, const ValidationUtils& utils) override;