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

bbende pushed a commit to branch NIFI-15258
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/NIFI-15258 by this push:
     new c8728b5ca0 NIFI-15525: Ensure that we call onStepConfigured when we 
restore flow; ensure that we synchronized Parmaeter Providers before Connectors 
(#10835)
c8728b5ca0 is described below

commit c8728b5ca0b75ec2a3fb7db6f6dfc48042eeb508
Author: Mark Payne <[email protected]>
AuthorDate: Fri Jan 30 09:09:08 2026 -0500

    NIFI-15525: Ensure that we call onStepConfigured when we restore flow; 
ensure that we synchronized Parmaeter Providers before Connectors (#10835)
---
 .../connector/secrets/ParameterProviderSecretsManager.java | 14 +++++++++++++-
 .../nifi/components/connector/StandardConnectorNode.java   |  8 ++++++--
 .../serialization/VersionedFlowSynchronizer.java           |  5 +++--
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/components/connector/secrets/ParameterProviderSecretsManager.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/components/connector/secrets/ParameterProviderSecretsManager.java
index edd1348393..524351a413 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/components/connector/secrets/ParameterProviderSecretsManager.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/components/connector/secrets/ParameterProviderSecretsManager.java
@@ -22,6 +22,8 @@ import org.apache.nifi.components.connector.SecretReference;
 import org.apache.nifi.components.validation.ValidationStatus;
 import org.apache.nifi.controller.ParameterProviderNode;
 import org.apache.nifi.controller.flow.FlowManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -35,6 +37,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 public class ParameterProviderSecretsManager implements SecretsManager {
+    private static final Logger logger = 
LoggerFactory.getLogger(ParameterProviderSecretsManager.class);
     private FlowManager flowManager;
 
     @Override
@@ -61,7 +64,12 @@ public class ParameterProviderSecretsManager implements 
SecretsManager {
     public Set<SecretProvider> getSecretProviders() {
         final Set<SecretProvider> providers = new HashSet<>();
         for (final ParameterProviderNode parameterProviderNode : 
flowManager.getAllParameterProviders()) {
-            if (parameterProviderNode.getValidationStatus() != 
ValidationStatus.VALID) {
+            ValidationStatus validationStatus = 
parameterProviderNode.getValidationStatus();
+            if (validationStatus != ValidationStatus.VALID) {
+                validationStatus = parameterProviderNode.performValidation();
+            }
+            if (validationStatus != ValidationStatus.VALID) {
+                logger.debug("Will not use Parameter Provider {} as a Secret 
Provider because it is not valid", parameterProviderNode.getName());
                 continue;
             }
 
@@ -88,6 +96,10 @@ public class ParameterProviderSecretsManager implements 
SecretsManager {
 
     @Override
     public Map<SecretReference, Secret> getSecrets(final Set<SecretReference> 
secretReferences) {
+        if (secretReferences.isEmpty()) {
+            return Map.of();
+        }
+
         // Partition secret references by Provider
         final Map<SecretProvider, Set<SecretReference>> referencesByProvider = 
new HashMap<>();
         for (final SecretReference secretReference : secretReferences) {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
index ae5c73f4cb..7c3b5a8c9d 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
@@ -195,7 +195,7 @@ public class StandardConnectorNode implements ConnectorNode 
{
         // Configure the working config but do not apply
         for (final VersionedConfigurationStep step : workingConfig) {
             final StepConfiguration stepConfig = createStepConfiguration(step);
-            setConfiguration(step.getName(), stepConfig);
+            setConfiguration(step.getName(), stepConfig, true);
         }
     }
 
@@ -311,9 +311,13 @@ public class StandardConnectorNode implements 
ConnectorNode {
 
     @Override
     public void setConfiguration(final String stepName, final 
StepConfiguration configuration) throws FlowUpdateException {
+        setConfiguration(stepName, configuration, false);
+    }
+
+    private void setConfiguration(final String stepName, final 
StepConfiguration configuration, final boolean 
forceOnConfigurationStepConfigured) throws FlowUpdateException {
         // Update properties and check if the configuration changed.
         final ConfigurationUpdateResult updateResult = 
workingFlowContext.getConfigurationContext().setProperties(stepName, 
configuration);
-        if (updateResult == ConfigurationUpdateResult.NO_CHANGES) {
+        if (updateResult == ConfigurationUpdateResult.NO_CHANGES && 
!forceOnConfigurationStepConfigured) {
             return;
         }
 
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 000a4897a5..1b8825971c 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
@@ -424,14 +424,15 @@ public class VersionedFlowSynchronizer implements 
FlowSynchronizer {
                 
versionedExternalFlow.setParameterContexts(versionedParameterContextMap);
                 
versionedExternalFlow.setFlowContents(versionedFlow.getRootGroup());
 
-                // Inherit Connectors first. Because Connectors are a bit 
different, in that updates could result in Exceptions being thrown,
+                // Inherit Parameter Providers and Connectors first. Because 
Connectors are a bit different, in that updates could result in Exceptions 
being thrown,
                 // due to the fact that they manipulate the flow, and changes 
can be aborted, we handle them first. This way, if there's any Exception,
                 // we can fail before updating parts of the flow that are not 
managed by Connectors.
+                // Because Connectors may depend on Parameter Providers, we 
need to ensure that we inherit Parameter Providers first.
+                inheritParameterProviders(controller, versionedFlow, 
affectedComponentSet);
                 inheritConnectors(controller, versionedFlow);
 
                 // Inherit controller-level components.
                 inheritControllerServices(controller, versionedFlow, 
affectedComponentSet);
-                inheritParameterProviders(controller, versionedFlow, 
affectedComponentSet);
                 inheritParameterContexts(controller, versionedFlow);
                 inheritReportingTasks(controller, versionedFlow, 
affectedComponentSet);
                 inheritFlowAnalysisRules(controller, versionedFlow, 
affectedComponentSet);

Reply via email to