]> granicus.if.org Git - icinga2/commitdiff
Avoid concurrent cluster config sync transactions 7230/head
authorMichael Friedrich <michael.friedrich@icinga.com>
Mon, 13 May 2019 09:26:39 +0000 (11:26 +0200)
committerMichael Friedrich <michael.friedrich@icinga.com>
Wed, 5 Jun 2019 13:23:28 +0000 (15:23 +0200)
fixes #6660

lib/remote/apilistener-filesync.cpp
lib/remote/apilistener.hpp

index 87aae61044bfe13c3a7a411eb7c0c9f6b00d4c7f..411028630f9a856e12a5065987d7815ce5e328eb 100644 (file)
@@ -15,6 +15,8 @@ using namespace icinga;
 
 REGISTER_APIFUNCTION(Update, config, &ApiListener::ConfigUpdateHandler);
 
+boost::mutex ApiListener::m_ConfigSyncStageLock;
+
 void ApiListener::ConfigGlobHandler(ConfigDirInformation& config, const String& path, const String& file)
 {
        CONTEXT("Creating config update for file '" + file + "'");
@@ -274,6 +276,11 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
                return Empty;
        }
 
+       /* Only one transaction is allowed, concurrent message handlers need to wait.
+        * This affects two parent endpoints sending the config in the same moment.
+        */
+       boost::mutex::scoped_lock lock(m_ConfigSyncStageLock);
+
        Log(LogInformation, "ApiListener")
                << "Applying config update from endpoint '" << origin->FromClient->GetEndpoint()->GetName()
                << "' of zone '" << GetFromZoneName(origin->FromZone) << "'.";
index 5818ec9948560a62e533140871aa956b8f2b3082..022ad8281aad15505c32455fc10bee2d233f55a4 100644 (file)
@@ -165,6 +165,8 @@ private:
        void RemoveStatusFile();
 
        /* filesync */
+       static boost::mutex m_ConfigSyncStageLock;
+
        static ConfigDirInformation LoadConfigDir(const String& dir);
        static Dictionary::Ptr MergeConfigUpdate(const ConfigDirInformation& config);
        static bool UpdateConfigDir(const ConfigDirInformation& oldConfig, const ConfigDirInformation& newConfig, const String& configDir, bool authoritative);