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;