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 d25cd5d89706620076116050b6402f911ecfc4e9 Author: Gabor Gyimesi <[email protected]> AuthorDate: Wed Feb 8 16:28:08 2023 +0100 MINIFICPP-1975 Volatile and persistent combination of repositories should be avoided Closes #1465 Signed-off-by: Marton Szasz <[email protected]> --- controller/Controller.h | 15 ++++++++++++--- libminifi/src/core/RepositoryFactory.cpp | 32 ++++++++++++++------------------ minifi_main/MiNiFiMain.cpp | 8 ++++++++ 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/controller/Controller.h b/controller/Controller.h index 11b941925..836357977 100644 --- a/controller/Controller.h +++ b/controller/Controller.h @@ -27,6 +27,8 @@ #include "utils/gsl.h" #include "Exception.h" #include "FlowController.h" +#include "core/repository/VolatileContentRepository.h" +#include "core/repository/VolatileFlowFileRepository.h" /** * Sends a single argument comment @@ -258,13 +260,16 @@ std::shared_ptr<org::apache::nifi::minifi::core::controller::ControllerService> if (!flow_repo) { throw org::apache::nifi::minifi::Exception(org::apache::nifi::minifi::REPOSITORY_EXCEPTION, "Could not create flowfile repository"); } - flow_repo->initialize(configuration); - configuration->get(org::apache::nifi::minifi::Configure::nifi_content_repository_class_name, content_repo_class); const std::shared_ptr content_repo = org::apache::nifi::minifi::core::createContentRepository(content_repo_class, true, "content"); + const bool is_flow_repo_non_persistent = flow_repo->isNoop() || std::dynamic_pointer_cast<org::apache::nifi::minifi::core::repository::VolatileFlowFileRepository>(flow_repo) != nullptr; + const bool is_content_repo_non_persistent = std::dynamic_pointer_cast<org::apache::nifi::minifi::core::repository::VolatileContentRepository>(content_repo) != nullptr; + if (is_flow_repo_non_persistent != is_content_repo_non_persistent) { + throw org::apache::nifi::minifi::Exception(org::apache::nifi::minifi::REPOSITORY_EXCEPTION, "Both or neither of flowfile and content repositories must be persistent!"); + } content_repo->initialize(configuration); @@ -315,12 +320,16 @@ void printManifest(const std::shared_ptr<org::apache::nifi::minifi::Configure> & if (!flow_repo) { throw org::apache::nifi::minifi::Exception(org::apache::nifi::minifi::REPOSITORY_EXCEPTION, "Could not create flowfile repository"); } - flow_repo->initialize(configuration); configuration->get(org::apache::nifi::minifi::Configure::nifi_content_repository_class_name, content_repo_class); const std::shared_ptr content_repo = org::apache::nifi::minifi::core::createContentRepository(content_repo_class, true, "content"); + const bool is_flow_repo_non_persistent = flow_repo->isNoop() || std::dynamic_pointer_cast<org::apache::nifi::minifi::core::repository::VolatileFlowFileRepository>(flow_repo) != nullptr; + const bool is_content_repo_non_persistent = std::dynamic_pointer_cast<org::apache::nifi::minifi::core::repository::VolatileContentRepository>(content_repo) != nullptr; + if (is_flow_repo_non_persistent != is_content_repo_non_persistent) { + throw org::apache::nifi::minifi::Exception(org::apache::nifi::minifi::REPOSITORY_EXCEPTION, "Both or neither of flowfile and content repositories must be persistent!"); + } content_repo->initialize(configuration); diff --git a/libminifi/src/core/RepositoryFactory.cpp b/libminifi/src/core/RepositoryFactory.cpp index f376dbeb1..fd1cb305e 100644 --- a/libminifi/src/core/RepositoryFactory.cpp +++ b/libminifi/src/core/RepositoryFactory.cpp @@ -84,25 +84,21 @@ class NoOpThreadedRepository : public core::ThreadedRepository { std::unique_ptr<core::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); - try { - auto return_obj = core::ClassLoader::getDefaultClassLoader().instantiate<core::ThreadedRepository>(class_name_lc, - class_name_lc); - if (return_obj) { - return_obj->setName(repo_name); - return return_obj; - } - // 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") { - return instantiate<repository::VolatileFlowFileRepository>(repo_name); - } else if (class_name_lc == "provenancerepository" || class_name_lc == "volatileprovenancefilerepository") { - return instantiate<repository::VolatileProvenanceRepository>(repo_name); - } else if (class_name_lc == "nooprepository") { - return std::make_unique<core::NoOpThreadedRepository>(repo_name); - } - return {}; - } catch (const std::runtime_error&) { - throw; + auto return_obj = core::ClassLoader::getDefaultClassLoader().instantiate<core::ThreadedRepository>(class_name_lc, + class_name_lc); + if (return_obj) { + return_obj->setName(repo_name); + return return_obj; + } + // 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") { + return instantiate<repository::VolatileFlowFileRepository>(repo_name); + } else if (class_name_lc == "provenancerepository" || class_name_lc == "volatileprovenancefilerepository") { + return instantiate<repository::VolatileProvenanceRepository>(repo_name); + } else if (class_name_lc == "nooprepository") { + return std::make_unique<core::NoOpThreadedRepository>(repo_name); } + return {}; } } // namespace org::apache::nifi::minifi::core diff --git a/minifi_main/MiNiFiMain.cpp b/minifi_main/MiNiFiMain.cpp index f0d4fe769..63ee396b2 100644 --- a/minifi_main/MiNiFiMain.cpp +++ b/minifi_main/MiNiFiMain.cpp @@ -55,6 +55,8 @@ #include "core/ConfigurationFactory.h" #include "core/RepositoryFactory.h" #include "core/extension/ExtensionManager.h" +#include "core/repository/VolatileContentRepository.h" +#include "core/repository/VolatileFlowFileRepository.h" #include "DiskSpaceWatchdog.h" #include "properties/Decryptor.h" #include "utils/file/PathUtils.h" @@ -343,6 +345,12 @@ int main(int argc, char **argv) { logger->log_error("Content repository failed to initialize, exiting.."); exit(1); } + const bool is_flow_repo_non_persistent = flow_repo->isNoop() || std::dynamic_pointer_cast<core::repository::VolatileFlowFileRepository>(flow_repo) != nullptr; + const bool is_content_repo_non_persistent = std::dynamic_pointer_cast<core::repository::VolatileContentRepository>(content_repo) != nullptr; + if (is_flow_repo_non_persistent != is_content_repo_non_persistent) { + logger->log_error("Both or neither of flowfile and content repositories must be persistent! Exiting.."); + exit(1); + } std::string content_repo_path; if (configure->get(minifi::Configure::nifi_dbcontent_repository_directory_default, content_repo_path) && !content_repo_path.empty()) {
