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

pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new e540f72989 NIFI-13688 Run Validation on Parameter Providers before 
fetching
e540f72989 is described below

commit e540f7298978eaca68396095eaf0a9721db1f518
Author: exceptionfactory <[email protected]>
AuthorDate: Thu Aug 29 14:23:56 2024 -0500

    NIFI-13688 Run Validation on Parameter Providers before fetching
    
    Signed-off-by: Pierre Villard <[email protected]>
    
    This closes #9220.
---
 .../service/StandardControllerServiceNode.java     | 16 ++++++-------
 .../serialization/VersionedFlowSynchronizer.java   | 27 +++++++++++++++++++---
 2 files changed, 32 insertions(+), 11 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
index 97cfc010d9..d21cd2586b 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
@@ -620,7 +620,7 @@ public class StandardControllerServiceNode extends 
AbstractComponentNode impleme
                     final ConfigurationContext configContext = new 
StandardConfigurationContext(StandardControllerServiceNode.this, 
controllerServiceProvider, null);
 
                     if (!isActive()) {
-                        LOG.warn("{} is no longer active so will no longer 
attempt to enable it", StandardControllerServiceNode.this);
+                        LOG.warn("Enabling {} stopped: no active status", 
StandardControllerServiceNode.this);
                         stateTransition.disable();
                         future.complete(null);
                         return;
@@ -629,21 +629,21 @@ public class StandardControllerServiceNode extends 
AbstractComponentNode impleme
                     final ValidationStatus validationStatus = 
getValidationStatus();
                     if (validationStatus != ValidationStatus.VALID) {
                         final ValidationState validationState = 
getValidationState();
-                        LOG.debug("Cannot enable {} because it is not 
currently valid. (Validation State is {}: {}). Will try again in 1 second",
-                            StandardControllerServiceNode.this, 
validationState, validationState.getValidationErrors());
+                        LOG.debug("Enabling {} failed: Validation Status [{}] 
Errors {} Attempt [{}] Retrying...",
+                            StandardControllerServiceNode.this, 
validationStatus, validationState.getValidationErrors(), 
enablingAttemptCount.get());
 
                         enablingAttemptCount.incrementAndGet();
                         if (enablingAttemptCount.get() == 120 || 
enablingAttemptCount.get() % 3600 == 0) {
                             final ComponentLog componentLog = new 
SimpleProcessLogger(getIdentifier(), StandardControllerServiceNode.this,
                                     new 
StandardLoggingContext(StandardControllerServiceNode.this));
-                            componentLog.error("Encountering difficulty 
enabling. (Validation State is {}: {}). Will continue trying to enable.",
-                                    validationState, 
validationState.getValidationErrors());
+                            componentLog.error("Enabling {} failed: Validation 
Status [{}] Errors {}",
+                                    service, validationStatus, 
validationState.getValidationErrors());
                         }
 
                         try {
                             scheduler.schedule(this, 1, TimeUnit.SECONDS);
                         } catch (RejectedExecutionException 
rejectedExecutionException) {
-                            LOG.error("Unable to enable {}.  Last known 
validation state was {} : {}", StandardControllerServiceNode.this, 
validationState, validationState.getValidationErrors(),
+                            LOG.error("Enabling {} failed: Validation Status 
[{}] Errors {}", StandardControllerServiceNode.this, validationStatus, 
validationState.getValidationErrors(),
                                     rejectedExecutionException);
                         }
                         future.complete(null);
@@ -661,14 +661,14 @@ public class StandardControllerServiceNode extends 
AbstractComponentNode impleme
                         }
 
                         if (!shouldEnable) {
-                            LOG.info("Disabling service {} after it has been 
enabled due to disable action being initiated.", service);
+                            LOG.info("Disabling {} after enabled due to 
disable action initiated", service);
                             // Can only happen if user initiated DISABLE 
operation before service finished enabling. It's state will be
                             // set to DISABLING (see disable() operation)
                             invokeDisable(configContext);
                             stateTransition.disable();
                             future.complete(null);
                         } else {
-                            LOG.info("Successfully enabled {}", service);
+                            LOG.info("Enabled {}", service);
                         }
                     } catch (Exception e) {
                         future.completeExceptionally(e);
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/VersionedFlowSynchronizer.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/VersionedFlowSynchronizer.java
index d130bf4b92..0de7e29281 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/VersionedFlowSynchronizer.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/VersionedFlowSynchronizer.java
@@ -1061,9 +1061,7 @@ public class VersionedFlowSynchronizer implements 
FlowSynchronizer {
             providedParameters = Collections.emptyMap();
         } else {
             final ParameterProviderNode parameterProviderNode = 
flowManager.getParameterProvider(parameterProviderId);
-
-            // Wait for Validation as needed for Parameter Providers with 
Controller Services
-            final ValidationStatus validationStatus = 
parameterProviderNode.getValidationStatus(10, TimeUnit.SECONDS);
+            final ValidationStatus validationStatus = 
getParameterProviderValidationStatus(parameterProviderNode);
 
             final String parameterGroupName = 
versionedParameterContext.getParameterGroupName();
             if (ValidationStatus.VALID == validationStatus) {
@@ -1096,6 +1094,29 @@ public class VersionedFlowSynchronizer implements 
FlowSynchronizer {
         return parameters;
     }
 
+    private ValidationStatus getParameterProviderValidationStatus(final 
ParameterProviderNode parameterProviderNode) {
+        final ValidationStatus workingValidationStatus;
+
+        final ValidationStatus currentValidationStatus = 
parameterProviderNode.getValidationStatus();
+        if (ValidationStatus.VALIDATING == currentValidationStatus) {
+            // Perform validation to determine status before fetching 
Parameters
+            workingValidationStatus = 
parameterProviderNode.performValidation();
+        } else {
+            workingValidationStatus = currentValidationStatus;
+        }
+
+        final ValidationStatus validationStatus;
+        if (ValidationStatus.INVALID == workingValidationStatus) {
+            // Wait for Validation as needed for Parameter Providers with 
Controller Services or other dependencies
+            parameterProviderNode.resetValidationState();
+            validationStatus = parameterProviderNode.getValidationStatus(10, 
TimeUnit.SECONDS);
+        } else {
+            validationStatus = workingValidationStatus;
+        }
+
+        return validationStatus;
+    }
+
     private void removeMissingServices(final FlowController controller, final 
VersionedDataflow dataflow) {
         if (dataflow == null) {
             return;

Reply via email to