This is an automated email from the ASF dual-hosted git repository.

szaszm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 3c83d84ca21df47565a8a61f6af529b161fba3f2
Author: Martin Zink <[email protected]>
AuthorDate: Thu Jan 29 16:17:05 2026 +0100

    MINIFICPP-2700 Terminate if ContentRepository creation failed
    
    Closes #2083
    
    Signed-off-by: Marton Szasz <[email protected]>
---
 .../tests/PrometheusMetricsPublisherTest.cpp       |  2 +-
 libminifi/include/core/RepositoryFactory.h         | 16 ++-----
 libminifi/src/core/RepositoryFactory.cpp           | 54 +++++++++++-----------
 minifi_main/MiNiFiMain.cpp                         |  2 +-
 4 files changed, 31 insertions(+), 43 deletions(-)

diff --git a/extensions/prometheus/tests/PrometheusMetricsPublisherTest.cpp 
b/extensions/prometheus/tests/PrometheusMetricsPublisherTest.cpp
index 33c078898..36c88ecce 100644
--- a/extensions/prometheus/tests/PrometheusMetricsPublisherTest.cpp
+++ b/extensions/prometheus/tests/PrometheusMetricsPublisherTest.cpp
@@ -52,7 +52,7 @@ class PrometheusPublisherTestFixture {
     : configuration_(std::make_shared<ConfigureImpl>()),
       provenance_repo_(core::createRepository("provenancerepository")),
       flow_file_repo_(core::createRepository("flowfilerepository")),
-      
content_repo_(core::createContentRepository("volatilecontentrepository")),
+      content_repo_(core::createContentRepository("volatilecontentrepository", 
"", 
*core::logging::LoggerFactory<PrometheusPublisherTestFixture>::getLogger())),
       
response_node_loader_(std::make_shared<state::response::ResponseNodeLoaderImpl>(configuration_,
         
std::vector<std::shared_ptr<core::RepositoryMetricsSource>>{provenance_repo_, 
flow_file_repo_, content_repo_}, nullptr)) {
     std::unique_ptr<DummyMetricsExposer> dummy_exposer;
diff --git a/libminifi/include/core/RepositoryFactory.h 
b/libminifi/include/core/RepositoryFactory.h
index 67c308aef..c3ad9c032 100644
--- a/libminifi/include/core/RepositoryFactory.h
+++ b/libminifi/include/core/RepositoryFactory.h
@@ -27,20 +27,10 @@
 
 namespace org::apache::nifi::minifi::core {
 
-/**
- * Create a context repository
- * @param configuration_class_name configuration class name
- * @param fail_safe determines whether or not to make the default class if 
configuration_class_name is invalid
- * @param repo_name name of the repository
- */
-std::unique_ptr<core::ContentRepository> createContentRepository(const 
std::string& configuration_class_name, bool fail_safe = false, const 
std::string& repo_name = "");
+std::unique_ptr<core::ContentRepository> createContentRepository(const 
std::string& configuration_class_name,
+    const std::string& repo_name,
+    logging::Logger& logger);
 
-/**
- * Create a repository represented by the configuration class name
- * @param configuration_class_name configuration class name
- * @param fail_safe determines whether or not to make the default class if 
configuration_class_name is invalid
- * @param repo_name name of the repository
- */
 std::unique_ptr<core::Repository> createRepository(const std::string& 
configuration_class_name, const std::string& repo_name = "");
 
 }  // namespace org::apache::nifi::minifi::core
diff --git a/libminifi/src/core/RepositoryFactory.cpp 
b/libminifi/src/core/RepositoryFactory.cpp
index 07aa04883..914798186 100644
--- a/libminifi/src/core/RepositoryFactory.cpp
+++ b/libminifi/src/core/RepositoryFactory.cpp
@@ -23,45 +23,42 @@
 #include "core/repository/FileSystemRepository.h"
 #include "core/repository/VolatileProvenanceRepository.h"
 #include "core/repository/NoOpThreadedRepository.h"
+#include "range/v3/algorithm/transform.hpp"
 
 using namespace std::literals::chrono_literals;
 
 namespace org::apache::nifi::minifi::core {
 
-std::unique_ptr<core::ContentRepository> createContentRepository(const 
std::string& configuration_class_name, bool fail_safe, const std::string& 
repo_name) {
+std::unique_ptr<ContentRepository> createContentRepository(const std::string& 
configuration_class_name,
+    const std::string& repo_name,
+    logging::Logger& logger) {
   std::string class_name_lc = configuration_class_name;
-  std::transform(class_name_lc.begin(), class_name_lc.end(), 
class_name_lc.begin(), ::tolower);
-  try {
-    auto return_obj = 
core::ClassLoader::getDefaultClassLoader().instantiate<core::ContentRepository>(class_name_lc,
-                                                                               
                       class_name_lc);
-    if (return_obj) {
-      return_obj->setName(repo_name);
-      return return_obj;
-    }
-    if (class_name_lc == "volatilecontentrepository") {
-      return 
std::make_unique<core::repository::VolatileContentRepository>(repo_name);
-    } else if (class_name_lc == "filesystemrepository") {
-      return 
std::make_unique<core::repository::FileSystemRepository>(repo_name);
-    }
-    if (fail_safe) {
-      return 
std::make_unique<core::repository::VolatileContentRepository>("fail_safe");
-    } else {
-      throw std::runtime_error("Support for the provided configuration class 
could not be found");
-    }
-  } catch (const std::runtime_error&) {
-    if (fail_safe) {
-      return 
std::make_unique<core::repository::VolatileContentRepository>("fail_safe");
-    }
+  ranges::transform(class_name_lc, class_name_lc.begin(), ::tolower);
+
+  if (auto return_obj = 
ClassLoader::getDefaultClassLoader().instantiate<ContentRepository>(class_name_lc,
 class_name_lc)) {
+    return_obj->setName(repo_name);
+    return return_obj;
+  }
+
+  if (class_name_lc == "volatilecontentrepository") {
+    return std::make_unique<repository::VolatileContentRepository>(repo_name);
+  }
+  if (class_name_lc == "filesystemrepository") {
+    return std::make_unique<repository::FileSystemRepository>(repo_name);
   }
 
-  throw std::runtime_error("Support for the provided configuration class could 
not be found");
+  logger.log_critical("Could not create the configured content repository 
({})", configuration_class_name);
+  if (class_name_lc == "databasecontentrepository") {
+    logger.log_error("To use DatabaseContentRepository MiNiFi needs RocksDB 
extension, please check the extension path configured in minifi.properties");
+  }
+
+  throw std::runtime_error("Support for the provided configuration class could 
not be found, check logs for more details");
 }
 
-std::unique_ptr<core::Repository> createRepository(const std::string& 
configuration_class_name, const std::string& repo_name) {
+std::unique_ptr<Repository> createRepository(const std::string& 
configuration_class_name, const std::string& repo_name) {
   std::string class_name_lc = configuration_class_name;
   std::transform(class_name_lc.begin(), class_name_lc.end(), 
class_name_lc.begin(), ::tolower);
-  auto return_obj = 
core::ClassLoader::getDefaultClassLoader().instantiate<core::ThreadedRepository>(class_name_lc,
-                                                                               
                      class_name_lc);
+  auto return_obj = 
ClassLoader::getDefaultClassLoader().instantiate<ThreadedRepository>(class_name_lc,
 class_name_lc);
   if (return_obj) {
     return_obj->setName(repo_name);
     return return_obj;
@@ -69,7 +66,8 @@ std::unique_ptr<core::Repository> createRepository(const 
std::string& configurat
   // if the desired repos don't exist, we can try doing string matches and 
rely on volatile repositories
   if (class_name_lc == "flowfilerepository" || class_name_lc == 
"volatileflowfilerepository" || class_name_lc == "nooprepository") {
     return std::make_unique<repository::NoOpThreadedRepository>(repo_name);
-  } else if (class_name_lc == "provenancerepository" || class_name_lc == 
"volatileprovenancerepository") {
+  }
+  if (class_name_lc == "provenancerepository" || class_name_lc == 
"volatileprovenancerepository") {
     return instantiate<repository::VolatileProvenanceRepository>(repo_name);
   }
   return {};
diff --git a/minifi_main/MiNiFiMain.cpp b/minifi_main/MiNiFiMain.cpp
index f5c852cf1..958276a8b 100644
--- a/minifi_main/MiNiFiMain.cpp
+++ b/minifi_main/MiNiFiMain.cpp
@@ -352,7 +352,7 @@ int main(int argc, char **argv) {
 
     configure->get(minifi::Configure::nifi_content_repository_class_name, 
content_repo_class);
 
-    std::shared_ptr<core::ContentRepository> content_repo = 
core::createContentRepository(content_repo_class, true, "content");
+    std::shared_ptr<core::ContentRepository> content_repo = 
core::createContentRepository(content_repo_class, "content", *logger);
 
     if (!content_repo->initialize(configure)) {
       logger->log_error("Content repository failed to initialize, exiting..");

Reply via email to