From 087c8b535434a5a40034104a74c547433f011aad Mon Sep 17 00:00:00 2001 From: Yonas Habteab Date: Tue, 13 Feb 2024 14:52:20 +0100 Subject: [PATCH] ApiListener: Process cluster config updates sequentially --- lib/remote/apilistener-configsync.cpp | 15 +++++++++++++++ lib/remote/apilistener.hpp | 3 +++ 2 files changed, 18 insertions(+) diff --git a/lib/remote/apilistener-configsync.cpp b/lib/remote/apilistener-configsync.cpp index f19092ffc73..b0384adba17 100644 --- a/lib/remote/apilistener-configsync.cpp +++ b/lib/remote/apilistener-configsync.cpp @@ -7,6 +7,7 @@ #include "base/configtype.hpp" #include "base/json.hpp" #include "base/convert.hpp" +#include "base/defer.hpp" #include "config/vmops.hpp" #include @@ -104,6 +105,13 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin return Empty; } + // Wait for the object name to become available for processing and block it immediately. + listener->m_ObjectConfigChangeLock.WaitForObject(ptype, objName); + + Defer unlockAndNotifyOne([&listener, &ptype, &objName]{ + listener->m_ObjectConfigChangeLock.UnBlockNotify(ptype, objName); + }); + ConfigObject::Ptr object = ctype->GetObject(objName); String config = params->Get("config"); @@ -258,6 +266,13 @@ Value ApiListener::ConfigDeleteObjectAPIHandler(const MessageOrigin::Ptr& origin return Empty; } + // Wait for the object name to become available for processing and block it immediately. + listener->m_ObjectConfigChangeLock.WaitForObject(ptype, objName); + + Defer unblockAndNotifyOne([&listener, &ptype, &objName]{ + listener->m_ObjectConfigChangeLock.UnBlockNotify(ptype, objName); + }); + ConfigObject::Ptr object = ctype->GetObject(objName); if (!object) { diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 2f653d8f0ac..ae5fadeb507 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -271,6 +271,9 @@ class ApiListener final : public ObjectImpl mutable std::mutex m_ActivePackageStagesLock; std::map m_ActivePackageStages; + /* ensures that at most one create/update/delete is being processed per object at each time */ + mutable ObjectNameMutex m_ObjectConfigChangeLock; + void UpdateActivePackageStagesCache(); };