Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-16272

Using an expression in use-java-context for a datasource results in IllegalArgumentException for certain console commands

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Major
    • 27.0.0.Alpha1, 27.0.0.Final
    • 26.1.0.Final
    • JCA
    • None
    • Hide
      1. Set the use-java-context }}attribute of the ExampleDS in standalone/configuration/standalone.xml to {{{}use-java-context="${env.db_java_context}".
      2. Export db_java_context, export db_java_context=true
      3. Start JBoss EAP in standalone mode and then connect to the console
      4. In the console, observe that the use-java-context is an expression:
      [standalone@localhost:9990 /] /subsystem=datasources/data-source=ExampleDS:read-attribute(name=use-java-context
      {
          "outcome" => "success",
          "result" => expression "${env.db_java_context}"
      }
      1. Also observe that resolving the expression results in the "true" value:
      [standalone@localhost:9990 /] /subsystem=datasources/data-source=ExampleDS:read-attribute(name=use-java-context,resolve-expressions=true
      {
          "outcome" => "success",
          "result" => "true"
      }
      1. Try running test-connection-in-pool against the datasource:
      [standalone@localhost:9990 /] /subsystem=datasources/data-source=ExampleDS:test-connection-in-pool
      {
          "outcome" => "failed",
          "failure-description" => "WFLYCTL0158: Operation handler failed: java.lang.IllegalArgumentException",
          "rolled-back" => true
      }
      Show
      Set the use-java-context }}attribute of the ExampleDS in standalone/configuration/standalone.xml to {{{}use-java-context="${env.db_java_context}" . Export db_java_context, export db_java_context=true Start JBoss EAP in standalone mode and then connect to the console In the console, observe that the use-java-context is an expression: [standalone@localhost:9990 /] /subsystem=datasources/data-source=ExampleDS:read-attribute(name=use-java-context {     "outcome" => "success" ,   "result" => expression "${env.db_java_context}" } Also observe that resolving the expression results in the "true" value: [standalone@localhost:9990 /] /subsystem=datasources/data-source=ExampleDS:read-attribute(name=use-java-context,resolve-expressions= true {     "outcome" => "success" ,     "result" => " true " } Try running test-connection-in-pool against the datasource: [standalone@localhost:9990 /] /subsystem=datasources/data-source=ExampleDS:test-connection-in-pool {     "outcome" => "failed" ,     "failure-description" => "WFLYCTL0158: Operation handler failed: java.lang.IllegalArgumentException" ,     "rolled-back" => true }
    • ---
    • ---

    Description

      Specifying use-java-context for a datasource as an expression (for example, use-java-context="${env.db_java_context}") results in an IllegalArgumentException for the following console commands:

      • test-connection-in-pool
      • flush-*
      • dump-queued-threads-in-pool

      Here is a stack trace for test-connection-in-pool:

       

      09:19:24,271 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 1) WFLYCTL0013: Operation ("test-connection-in-pool") failed - address: ([
          ("subsystem" => "datasources"),
          ("data-source" => "ExampleDS")
      ]): java.lang.IllegalArgumentException
              at org.jboss.dmr@1.5.0.Final-redhat-1//org.jboss.dmr.ModelValue.asBoolean(ModelValue.java:69)
              at org.jboss.dmr@1.5.0.Final-redhat-1//org.jboss.dmr.ModelNode.asBoolean(ModelNode.java:324)
              at org.jboss.as.connector@7.2.0.GA-redhat-00005//org.jboss.as.connector.subsystems.datasources.Util.getJndiName(Util.java:49)
              at org.jboss.as.connector@7.2.0.GA-redhat-00005//org.jboss.as.connector.subsystems.common.pool.PoolOperations.execute(PoolOperations.java:72)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:999)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.AbstractOperationContext.processStages(AbstractOperationContext.java:743)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:467)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.OperationContextImpl.executeOperation(OperationContextImpl.java:1411)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.ModelControllerImpl.internalExecute(ModelControllerImpl.java:423)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.ModelControllerImpl.lambda$execute$1(ModelControllerImpl.java:243)
              at org.wildfly.security.elytron-private@1.6.1.Final-redhat-00001//org.wildfly.security.auth.server.SecurityIdentity.runAs(SecurityIdentity.java:265)
              at org.wildfly.security.elytron-private@1.6.1.Final-redhat-00001//org.wildfly.security.auth.server.SecurityIdentity.runAs(SecurityIdentity.java:231)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.ModelControllerImpl.execute(ModelControllerImpl.java:243)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.remote.ModelControllerClientOperationHandler$ExecuteRequestHandler.doExecute(ModelControllerClientOperationHandler.java:240)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.remote.ModelControllerClientOperationHandler$ExecuteRequestHandler.access$400(ModelControllerClientOperationHandler.java:138)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.remote.ModelControllerClientOperationHandler$ExecuteRequestHandler$1$1.run(ModelControllerClientOperationHandler.java:162)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.remote.ModelControllerClientOperationHandler$ExecuteRequestHandler$1$1.run(ModelControllerClientOperationHandler.java:158)
              at org.wildfly.security.elytron-private@1.6.1.Final-redhat-00001//org.wildfly.security.auth.server.SecurityIdentity.runAs(SecurityIdentity.java:289)
              at org.wildfly.security.elytron-private@1.6.1.Final-redhat-00001//org.wildfly.security.auth.server.SecurityIdentity.runAs(SecurityIdentity.java:246)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.AccessAuditContext.doAs(AccessAuditContext.java:254)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.AccessAuditContext.doAs(AccessAuditContext.java:225)
              at org.jboss.as.controller@6.0.11.Final-redhat-00001//org.jboss.as.controller.remote.ModelControllerClientOperationHandler$ExecuteRequestHandler$1.execute(ModelControllerClientOperationHandler.java:158)
              at org.jboss.as.protocol@6.0.11.Final-redhat-00001//org.jboss.as.protocol.mgmt.ManagementRequestContextImpl$1.doExecute(ManagementRequestContextImpl.java:70)
              at org.jboss.as.protocol@6.0.11.Final-redhat-00001//org.jboss.as.protocol.mgmt.ManagementRequestContextImpl$AsyncTaskRunner.run(ManagementRequestContextImpl.java:160)
              at org.jboss.threads@2.3.2.Final-redhat-1//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
              at org.jboss.threads@2.3.2.Final-redhat-1//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
              at org.jboss.threads@2.3.2.Final-redhat-1//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
              at org.jboss.threads@2.3.2.Final-redhat-1//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
              at java.base/java.lang.Thread.run(Thread.java:829)
              at org.jboss.threads@2.3.2.Final-redhat-1//org.jboss.threads.JBossThread.run(JBossThread.java:485)

      The problem seems to be in org.jboss.as.connector.subsystems.datasources.Util.getJndiName() which only treats the use-java-context attribute as a boolean.

       

       

      public static String getJndiName(final OperationContext context, final ModelNode modelNode) throws OperationFailedException {
          final String rawJndiName = JNDI_NAME.resolveModelAttribute(context, modelNode).asString();
          return cleanJndiName(rawJndiName, modelNode.hasDefined(USE_JAVA_CONTEXT.getName()) && modelNode.get(USE_JAVA_CONTEXT.getName()).asBoolean());
      }

       

      Switching the asBoolean() statement to something like modelNode.get(USE_JAVA_CONTEXT.getName()).asExpression().resolveBoolean() seems to fix the issue.

      Regular datasource access from an application does not seem to be affected because getJndiName() is not called.

      This seems to affect all versions of EAP 7.x.

      Attachments

        Issue Links

          Activity

            People

              chaowan@redhat.com Chao Wang
              chaowan@redhat.com Chao Wang
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: