MINIFICPP-1984 - Restart old flow on failed flow update

Signed-off-by: Gabor Gyimesi <gamezbird@gmail.com>

This closes #1452
diff --git a/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h b/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h
index 0ed1254..58a0dac 100644
--- a/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h
+++ b/extensions/standard-processors/tests/unit/ProcessGroupTestUtils.h
@@ -68,7 +68,7 @@
     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 30bdd9b..f4fd27f 100644
--- a/extensions/standard-processors/tests/unit/YamlConfigurationTests.cpp
+++ b/extensions/standard-processors/tests/unit/YamlConfigurationTests.cpp
@@ -516,8 +516,8 @@
 Flow Controller:
   name: Simple
 Processors:
-- name: PutFile
-  class: PutFile
+- name: GenerateFlowFile
+  class: GenerateFlowFile
   Properties:
      Dynamic Property: Bad
       )";
@@ -525,10 +525,10 @@
   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 8d0264a..a6ca3a3 100644
--- a/libminifi/src/FlowController.cpp
+++ b/libminifi/src/FlowController.cpp
@@ -142,10 +142,16 @@
       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 @@
       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 9f9be9b..e1f23f3 100644
--- a/libminifi/src/core/yaml/YamlConfiguration.cpp
+++ b/libminifi/src/core/yaml/YamlConfiguration.cpp
@@ -135,6 +135,8 @@
     root->addControllerService(controller_service->getUUIDStr(), controller_service);
   }
 
+  root->verify();
+
   return root;
 }