This is an automated email from the ASF dual-hosted git repository. fgerlits pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit 162ccfb558abc3c3a97326daa5da010d28977da2 Author: Gabor Gyimesi <[email protected]> AuthorDate: Thu Feb 26 14:21:36 2026 +0100 MINIFICPP-2732 Clear class descriptions when extensions are cleared Signed-off-by: Ferenc Gerlits <[email protected]> Closes #2121 --- libminifi/include/core/extension/ExtensionManager.h | 6 ++++++ libminifi/src/agent/agent_docs.cpp | 3 +++ libminifi/src/core/extension/ExtensionManager.cpp | 8 ++++++++ minifi-api/include/minifi-cpp/agent/agent_docs.h | 1 + 4 files changed, 18 insertions(+) diff --git a/libminifi/include/core/extension/ExtensionManager.h b/libminifi/include/core/extension/ExtensionManager.h index ded6b4173..60af1229b 100644 --- a/libminifi/include/core/extension/ExtensionManager.h +++ b/libminifi/include/core/extension/ExtensionManager.h @@ -30,6 +30,12 @@ namespace org::apache::nifi::minifi::core::extension { class ExtensionManager { public: explicit ExtensionManager(const std::shared_ptr<Configure>& config); + ~ExtensionManager(); + + ExtensionManager(const ExtensionManager&) = delete; + ExtensionManager& operator=(const ExtensionManager&) = delete; + ExtensionManager(ExtensionManager&&) = delete; + ExtensionManager& operator=(ExtensionManager&&) = delete; private: std::vector<std::unique_ptr<Extension>> extensions_; diff --git a/libminifi/src/agent/agent_docs.cpp b/libminifi/src/agent/agent_docs.cpp index 0aeb58487..057e9188b 100644 --- a/libminifi/src/agent/agent_docs.cpp +++ b/libminifi/src/agent/agent_docs.cpp @@ -34,5 +34,8 @@ std::map<BundleIdentifier, Components>& ClassDescriptionRegistry::getMutableClas return getAgentDocsClassMappings(); } +void ClassDescriptionRegistry::clearClassDescriptions() { + getAgentDocsClassMappings().clear(); +} } // namespace org::apache::nifi::minifi diff --git a/libminifi/src/core/extension/ExtensionManager.cpp b/libminifi/src/core/extension/ExtensionManager.cpp index 0d60e7c6b..a8ef38caa 100644 --- a/libminifi/src/core/extension/ExtensionManager.cpp +++ b/libminifi/src/core/extension/ExtensionManager.cpp @@ -21,6 +21,7 @@ #include "core/logging/LoggerConfiguration.h" #include "core/extension/Extension.h" +#include "minifi-cpp/agent/agent_docs.h" #include "utils/file/FilePattern.h" #include "minifi-cpp/agent/agent_version.h" #include "core/extension/Utils.h" @@ -86,4 +87,11 @@ ExtensionManager::ExtensionManager(const std::shared_ptr<Configure>& config): lo } } +ExtensionManager::~ExtensionManager() { + // Clear the class description registry to avoid dangling pointers + // to validator objects that live in extension DLLs to be unloaded. + minifi::ClassDescriptionRegistry::clearClassDescriptions(); + extensions_.clear(); +} + } // namespace org::apache::nifi::minifi::core::extension diff --git a/minifi-api/include/minifi-cpp/agent/agent_docs.h b/minifi-api/include/minifi-cpp/agent/agent_docs.h index 912377d39..82e84f876 100644 --- a/minifi-api/include/minifi-cpp/agent/agent_docs.h +++ b/minifi-api/include/minifi-cpp/agent/agent_docs.h @@ -73,6 +73,7 @@ class ClassDescriptionRegistry { public: static const std::map<minifi::BundleIdentifier, Components>& getClassDescriptions(); static std::map<minifi::BundleIdentifier, Components>& getMutableClassDescriptions(); + static void clearClassDescriptions(); template<typename Class, ResourceType Type> static void createClassDescription(std::string bundle_name, std::string class_name, std::string version);
