[
https://issues.jboss.org/browse/WFCORE-1245?page=com.atlassian.jira.plugi...
]
Brian Stansberry commented on WFCORE-1245:
------------------------------------------
I'd like to propose a different solution.
I think the basic problem here is we as reporters (well, me, since I wrote this) are
guilty of burying the lede.[1]
The most important thing here is what services failed to start and what services are just
flat out missing. Those are the things the user needs to correct. The dependency data we
report is secondary, although it can be helpful in cases where a service is missing
because a dependent service misspelled it.
We handle the failed services reasonably; if there are any they come first in the failure
description ServiceVerificationHelper produces with a WFCORE0080 message.
With missing services we are terrible. Your patch helps a bit, but we still bury the
lede.
Here's the key bit from your after_1.log:
{code}
09:54:34,295 ERROR [org.jboss.as.controller.management-operation]
(management-handler-thread - 2) WFLYCTL0013: Operation ("deploy") failed -
address: ({"deployment" => "reproducer-1.0-SNAPSHOT.ear"}) -
failure description: {
"WFLYCTL0180: Services with missing/unavailable dependencies" => [
"jboss.naming.context.java.comp.testEar.client.TestEjb.ORB is missing
[jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.ValidatorFactory is
missing [jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.Validator is missing
[jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".weld.weldClassIntrospector
is missing
[jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager]",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".batch.environment
is missing
[jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.InAppClientContainer
is missing [jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.service-locator.test_ServiceLocator.env.queue.TestQueue
is missing [jboss.naming.context.java.jboss.resources.queue.TestQueue]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.HandleDelegate is
missing [jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.deployment.unit.\"reproducer-1.0-SNAPSHOT.ear\".deploymentCompleteService
is missing
[jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".deploymentCompleteService]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.InstanceName is
missing [jboss.naming.context.java.comp.testEar.client.TestEjb]"
],
"WFLYCTL0288: One or more services were unable to start due to one or more
indirect dependencies not being available." => {
"Services that were unable to start:" => [
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".INSTALL",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".CLEANUP",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".component.test_ServiceLocator.JndiBindingsService",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".component.test_ServiceLocator.START",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".deploymentCompleteService",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".jndiDependencyService",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".moduleDeploymentRuntimeInformationStart",
"jboss.deployment.unit.\"reproducer-1.0-SNAPSHOT.ear\".CLEANUP"
],
"Services that may be the cause:" => [
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".deploymentCompleteService",
"jboss.naming.context.java.comp.testEar.client.TestEjb",
"jboss.naming.context.java.jboss.resources.queue.TestQueue"
]
}
}
{code}
This WFLYCTL0180 bit was already reported; your PR adds the WFLYCTL0288 bit.
But the first part of the WFLYCTL0288 bit doesn't really help that much. It's more
info but does it really help the user understand much? They know from the first line of
the ERROR message that the ear deployment failed. The fact that some other services
didn't start is to an extent just more noise.
The real value is the last bit:
{code}
"Services that may be the cause:" => [
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".deploymentCompleteService",
"jboss.naming.context.java.comp.testEar.client.TestEjb",
"jboss.naming.context.java.jboss.resources.queue.TestQueue"
]
{code}
That's the list of missing services; the key bit of information! It should be right up
front! The WFLYCTL0180 message shows those, but mixed in with other stuff in a wall of
text.
So I think instead of changing things to make the WFLYCTL0288 message show up, we should
add a new part of the message, *before* the WFLYCTL0180 bit:
{code}
"WFCORE0xxx: Required services that are not installed:" => [
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".deploymentCompleteService",
"jboss.naming.context.java.comp.testEar.client.TestEjb",
"jboss.naming.context.java.jboss.resources.queue.TestQueue"
]
{code}
So:
if (there are failures) {
WFCORE0080
}
if (there are dependency problems) {
WFCORE0xxx (new message listing completely missing services)
WFLYCTL0180 (shows direct dependencies of the missing ones, to help user find spots in
their app that may have bad references)
if (there's something else) {
WFCORE0288
}
}
WDYT?
[1]
https://en.wiktionary.org/wiki/bury_the_lede
Improve readability of missing dependency logs
----------------------------------------------
Key: WFCORE-1245
URL:
https://issues.jboss.org/browse/WFCORE-1245
Project: WildFly Core
Issue Type: Enhancement
Components: Domain Management
Reporter: Bartosz Spyrko-Śmietanko
Assignee: Bartosz Spyrko-Śmietanko
Attachments: after_1.log, after_2.log, before.log, bz1283294-reproducer.zip
When deploying an ear using initialize-in-order option, if one of the subdeployments
contains an EJB that depends on an EJB from another subdeployment and the dependency
subdeployment fails log output makes it hard to understand the root cause.
Structure of deployment is as follows:
{noformat}
reproducer.ear
|- service-locator.jar
| |- ServiceLocator (Stateless EJB)
| |- TestQueue (JNDI Resource)
|- client.jar
|- TestEjb (Stateless EJB)
|- ServiceLocator
{noformat}
If the TestQueue JNDI resource cannot be injected in the ServiceLocator, the deployment
failure output lists a number of missing services per each EJB in the dependant
subdeployment (.ORB, .HandleDelegate, .ValidatorFactory, etc).
When the dependant subdeployment has a larger number of EJBs the log output very quickly
becomes hard to read.
Example with a single dependant EJB:
{noformat}
14:27:43,092 ERROR [org.jboss.as.controller.management-operation]
(management-handler-thread - 2) WFLYCTL0013: Operation ("deploy") failed -
address: ({"deployment" => "reproducer-1.0-SNAPSHOT.ear"}) -
failure description: {
"WFLYCTL0180: Services with missing/unavailable dependencies" => [
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".batch.environment
is missing
[jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.ValidatorFactory is
missing [jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.ORB is missing
[jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.HandleDelegate is
missing [jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".weld.weldClassIntrospector
is missing
[jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".beanmanager]",
"jboss.deployment.unit.\"reproducer-1.0-SNAPSHOT.ear\".deploymentCompleteService
is missing
[jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".deploymentCompleteService]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.InstanceName is
missing [jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.Validator is missing
[jboss.naming.context.java.comp.testEar.client.TestEjb]",
"jboss.naming.context.java.comp.testEar.service-locator.test_ServiceLocator.env.queue.TestQueue
is missing [jboss.naming.context.java.jboss.resources.queue.TestQueue]",
"jboss.naming.context.java.comp.testEar.client.TestEjb.InAppClientContainer
is missing [jboss.naming.context.java.comp.testEar.client.TestEjb]"
],
"WFLYCTL0288: One or more services were unable to start due to one or more
indirect dependencies not being available." => {
"Services that were unable to start:" => [
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"client.jar\".INSTALL",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".CLEANUP",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".component.test_ServiceLocator.JndiBindingsService",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".component.test_ServiceLocator.START",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".deploymentCompleteService",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".jndiDependencyService",
"jboss.deployment.subunit.\"reproducer-1.0-SNAPSHOT.ear\".\"service-locator.jar\".moduleDeploymentRuntimeInformationStart",
"jboss.deployment.unit.\"reproducer-1.0-SNAPSHOT.ear\".CLEANUP"
]
{noformat}
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)