Bob Paulin created NIFI-15365:
---------------------------------
Summary: Classloader used during Controller Service Verify
Configuration missing additional resources
Key: NIFI-15365
URL: https://issues.apache.org/jira/browse/NIFI-15365
Project: Apache NiFi
Issue Type: Task
Components: Core Framework
Affects Versions: 2.7.0
Reporter: Bob Paulin
When Verifying configuration on a newly created DBCPConnectionPool (Controller
Service) the user is presented with an error [1]
Driver Class found but not loaded: Apply configuration before verifying.
This is due to the StandardControllerServiceNode.verifyConfiguration method
creating a new instance classloader [2] but still using the original controller
service [3] that was loaded with the original ControllerService instance class
loader any usage of Class.forName with in the controller service (or any
included sdks) will not be able to see additional urls included in the new
instance classloader [2].
*Proposal* (patch in progress)
For this to work a new temporary controller service must be created with the
new instance classloader and verify must be called on the temporary controller
service.
Will look to model this after the component reload that takes the following
actions (required or maybe required actions in this process bolded)
*1) get existing instance class loader and close calling on remove*
*2) Create new controller service.*
*A) Invoke build Controller service*
*i) Create Instance Class loader.*
*ii) get raw class*
*iii) set thread context class loader as new detected instance class loader*
*iv) Subclass raw class as ControllerService*
*v) Invoke Declared Constructor on class to instantiate impl*
vi) Create invocation handler for implementation [No needed controller
service will not be proxied].
vii) Extract all interfaces to create proxy service [No needed controller
service will not be proxied]
*viii) Build Initialization context with loggers, state managers, kerberos
etc. Invoke initialization. [ Propose doing this with a mock. Risk does
validation ever consider the original controller’s state management?
Kerberos?]*
ix) Verify controller service references to prevent issues with instance
class loading where service api and impls are in same nar but should not be [
Doesn’t matter should have already failed on initial controller creation]
x) Create new Controller Service Node and Validation context [Don’t need a
new node just to validate]
*xi) Set controller service node name, logging context, [node name not
needed…. Do we need the logging context? Maybe].*
xii) set Invocation handler service node as newly create service node. [ not
needed proxy won’t be used]
*xiii) set thread context back to original thread context class loader*
*B) if first time invoke on configuration restored and on added [ Do we need
controller service lifecycle called? Maybe but we definitely should not call
any framework methods]*
3) Put controller Service in process group [ Not needed we’ll be destroying
after validation]
4) Set invocation handler to existing node [ Not needed we’ll be destroying
after validation]
5) Create loggable components (implement and proxy) [ Not needed we’ll be
destroying after validation]
6) set luggable components into existing node and set extension missing [Not
needed we’ll be destroying after validation]
7) Refresh properties on existing node [ Not needed we’ll should be able to
pass properties in directly to verify]
8) Reset Validation State on existing node [ Not needed we’ll be destroying
after validation]
9) trigger validation on existing node. [ Not needed we’ll be destroying after
validation]
Note: This works fine if the Property defining the driver location is defined
as a Parameter within a Parameter Context because the apply action in the UI
reloads the controller service [4]
[1][https://github.com/apache/nifi/blob/09cfea2f5458474ec9f365370ca0b44741a65a93/nifi-extension-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPool.java#L132C45-L132C117]
[2][https://github.com/apache/nifi/blob/09cfea2f5458474ec9f365370ca0b44741a65a93/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java#L541]
[3]
[https://github.com/apache/nifi/blob/09cfea2f5458474ec9f365370ca0b44741a65a93/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java#L544]
[4]
[https://github.com/apache/nifi/blob/09cfea2f5458474ec9f365370ca0b44741a65a93/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java#L368]
--
This message was sent by Atlassian Jira
(v8.20.10#820010)