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

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

commit d1c0a99675ddb825d81b0ccce88e1dd4aedb8f3c
Author: Adam Debreceni <[email protected]>
AuthorDate: Tue Nov 15 09:23:20 2022 +0100

    MINIFICPP-1984 - Restart old flow on failed flow update
    
    Signed-off-by: Gabor Gyimesi <[email protected]>
    
    This closes #1452
---
 .../standard-processors/tests/unit/ProcessGroupTestUtils.h |  2 +-
 .../tests/unit/YamlConfigurationTests.cpp                  | 10 +++++-----
 libminifi/src/FlowController.cpp                           | 14 ++++++++------
 libminifi/src/core/yaml/YamlConfiguration.cpp              |  2 ++
 4 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h 
b/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h
index 0ed125426..58a0dacff 100644
--- a/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h
+++ b/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h
@@ -68,7 +68,7 @@ struct Proc {
     return {{
       "- id: " + id,
       "  name: " + name,
-      "  class: LogAttribute"
+      "  class: LogOnDestructionProcessor"
     }};
   }
 };
diff --git 
a/extensions/standard-processors/tests/unit/YamlConfigurationTests.cpp 
b/extensions/standard-processors/tests/unit/YamlConfigurationTests.cpp
index 30bdd9b38..f4fd27f29 100644
--- a/extensions/standard-processors/tests/unit/YamlConfigurationTests.cpp
+++ b/extensions/standard-processors/tests/unit/YamlConfigurationTests.cpp
@@ -516,8 +516,8 @@ TEST_CASE("Test Dynamic Unsupported", 
"[YamlConfigurationDynamicUnsupported]") {
 Flow Controller:
   name: Simple
 Processors:
-- name: PutFile
-  class: PutFile
+- name: GenerateFlowFile
+  class: GenerateFlowFile
   Properties:
      Dynamic Property: Bad
       )";
@@ -525,10 +525,10 @@ Processors:
   std::unique_ptr<core::ProcessGroup> rootFlowConfig = 
yamlConfig.getYamlRoot(configYamlStream);
 
   REQUIRE(rootFlowConfig);
-  REQUIRE(rootFlowConfig->findProcessorByName("PutFile"));
-  const utils::Identifier uuid = 
rootFlowConfig->findProcessorByName("PutFile")->getUUID();
+  REQUIRE(rootFlowConfig->findProcessorByName("GenerateFlowFile"));
+  const utils::Identifier uuid = 
rootFlowConfig->findProcessorByName("GenerateFlowFile")->getUUID();
   REQUIRE(uuid);
-  
REQUIRE(!rootFlowConfig->findProcessorByName("PutFile")->getUUIDStr().empty());
+  
REQUIRE(!rootFlowConfig->findProcessorByName("GenerateFlowFile")->getUUIDStr().empty());
 
   REQUIRE(LogTestController::getInstance().contains("[warning] Unable to set 
the dynamic property "
                                                     "Dynamic Property with 
value Bad"));
diff --git a/libminifi/src/FlowController.cpp b/libminifi/src/FlowController.cpp
index 8d0264a57..a6ca3a3dc 100644
--- a/libminifi/src/FlowController.cpp
+++ b/libminifi/src/FlowController.cpp
@@ -142,10 +142,16 @@ bool FlowController::applyConfiguration(const std::string 
&source, const std::st
       load(std::move(root_), true);
       flow_update_ = true;
       started = start() == 0;
+    } catch (const std::exception& ex) {
+      logger_->log_error("Caught exception while starting flow, type %s, what: 
%s", typeid(ex).name(), ex.what());
     } catch (...) {
-      this->root_ = std::move(prevRoot);
-      load(std::move(this->root_), true);
+      logger_->log_error("Caught unknown exception while starting flow, type 
%s", getCurrentExceptionTypeName());
+    }
+    if (!started) {
+      logger_->log_error("Failed to start new flow, restarting previous flow");
+      load(std::move(prevRoot), true);
       flow_update_ = true;
+      start();
     }
   }
 
@@ -292,10 +298,6 @@ void 
FlowController::load(std::unique_ptr<core::ProcessGroup> root, bool reload)
       this->root_ = loadInitialFlow();
     }
 
-    if (root_) {
-      root_->verify();
-    }
-
     logger_->log_info("Loaded root processor Group");
     logger_->log_info("Initializing timers");
     controller_service_provider_impl_ = 
flow_configuration_->getControllerServiceProvider();
diff --git a/libminifi/src/core/yaml/YamlConfiguration.cpp 
b/libminifi/src/core/yaml/YamlConfiguration.cpp
index 9f9be9be6..e1f23f3ac 100644
--- a/libminifi/src/core/yaml/YamlConfiguration.cpp
+++ b/libminifi/src/core/yaml/YamlConfiguration.cpp
@@ -135,6 +135,8 @@ std::unique_ptr<core::ProcessGroup> 
YamlConfiguration::getYamlRoot(const YAML::N
     root->addControllerService(controller_service->getUUIDStr(), 
controller_service);
   }
 
+  root->verify();
+
   return root;
 }
 

Reply via email to