-
Bug
-
Resolution: Done
-
Blocker
-
None
-
None
Somewhere along the line recently, EAP6.1 / AS 7.2 has a regression in remoting or xnio somehow, and this is causing blocking problems for tools.
Recall:
1) JBossTools bundles a set of jars capable of communicating with a running application server
2) This single set of jars must be capable of communicating with all servers in the 7.x stream
3) Bundling a second set of jars is not easily accomplished, but could be possible
And:
4) Using the as7.1.0 jars against eap6.1 in a specific unit test causes eclipse to hang
The basic code of our test case (once we get rid of the jbt stuff wrapped around it) is basically as follows:
this.client = ModelControllerClient.Factory.create(details.getHost(), details.getManagementPort(), getCallbackHandler()); this.manager = ServerDeploymentManager.Factory.create(client); DeploymentPlanBuilder builder = manager.newDeploymentPlan().replace(name, file); try { DeploymentAction action = builder.getLastAction(); Future<ServerDeploymentPlanResult> planResult = manager.execute(builder.build()); // FREEZE HERE // This is "DeploymentOperationResult.getStatus() in the stack trace ServerDeploymentActionResult actionResult = planResult.get().getDeploymentActionResult(action.getId()); IStatus status = createStatus(action.getDeploymentUnitUniqueName(), action.getType().name(), actionResult); } catch (Exception e) { throw new JBoss7ManangerException(e); }
The actual stack trace is:
Thread [main] (Suspended) owns: RunnableLock (id=461) waiting for: ActiveOperationSupport$ActiveOperationImpl<T,A> (id=462) Object.wait(long) line: not available [native method] ActiveOperationSupport$ActiveOperationImpl<T,A>(Object).wait() line: 503 ActiveOperationSupport$ActiveOperationImpl<T,A>(AsyncFutureTask<T>).await() line: 192 ActiveOperationSupport$ActiveOperationImpl<T,A>(AsyncFutureTask<T>).get() line: 266 AbstractModelControllerClient$DelegatingCancellableAsyncFuture.get() line: 363 AbstractModelControllerClient$DelegatingCancellableAsyncFuture.get() line: 317 ServerDeploymentPlanResultFuture.get() line: 76 ServerDeploymentPlanResultFuture.get() line: 42 DeploymentOperationResult.getStatus() line: 52 AS7ManagerTestUtils.waitUntilFinished(IJBoss7DeploymentResult) line: 93 AS7ManagerIntegrationTest.canReplaceWar() line: 129
The list of jars we are using to communicate with the server are:
jboss-as-controller-client-7.1.0.Final.jar jboss-as-protocol-7.1.0.Final.jar jboss-dmr-1.1.1.Final.jar jboss-logging-3.1.0.GA.jar jboss-marshalling-1.3.9.GA.jar jboss-remoting-3.2.7.GA.jar jboss-sasl-1.0.0.Final.jar jboss-threads-2.0.0.GA.jar xnio-api-3.0.3.GA.jar xnio-nio-3.0.3.GA.jar
It was suggested in irc by ctomc that we simply replace the following jars with new jars from jboss-as 7.2 / eap6.1:
jboss-remoting-3.2.7.GA.jar -> 3.2.15.GA xnio-api-3.0.3.GA.jar -> 3.0.7 xnio-nio-3.0.3.GA.jar -> 3.0.7
This approach also failed, with the following stack trace:
java.lang.NoClassDefFoundError: org/xnio/Cancellable (sic) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at org.jboss.as.controller.client.impl.RemotingModelControllerClient.<init>(RemotingModelControllerClient.java:59) at org.jboss.as.controller.client.ModelControllerClient$Factory.create(ModelControllerClient.java:211) at org.jboss.as.controller.client.ModelControllerClient$Factory.create(ModelControllerClient.java:173)
So it is obvious that jboss-as-controller jar from as-7.1 requires classes that are no longer present in xnio. If this is the case, it would indicate that xnio has REMOVED classes from its jar during an incremental version from 3.0.3 to 3.0.7, which would constitute an API breakage.
So clearly for us, updating only remoting and xnio does not work. The next possible solution would be to update ALL jars, however, this led to a similar situation when using AS7.2 / Eap 6.1 jars to communicate with an AS 7.0.0 server. Again, similar to what was mentioned above, all tests passed EXCEPT the test above. The test above failed with an almost identical stack trace:
Thread [main] (Suspended) owns: RunnableLock (id=160) waiting for: ActiveOperationSupport$ActiveOperationImpl<T,A> (id=161) Object.wait(long) line: not available [native method] ActiveOperationSupport$ActiveOperationImpl<T,A>(Object).wait() line: 503 ActiveOperationSupport$ActiveOperationImpl<T,A>(AsyncFutureTask<T>).await() line: 192 ActiveOperationSupport$ActiveOperationImpl<T,A>(AsyncFutureTask<T>).get() line: 266 AbstractModelControllerClient$DelegatingCancellableAsyncFuture(AbstractDelegatingAsyncFuture<T>).get() line: 100 ServerDeploymentPlanResultFuture.get() line: 76 ServerDeploymentPlanResultFuture.get() line: 42 DeploymentOperationResult.getStatus() line: 52 AS7ManagerTestUtils.waitUntilFinished(IJBoss7DeploymentResult) line: 93 AS7ManagerTestUtils.quietlyUndeploy(String, AS71Manager) line: 76 AS7ManagerIntegrationTest.canReplaceWar() line: 135
No matter how you look at it, the contract has been broken. JBossTools now is looking for a specific set of jars which care capable of communicating with AS7.0, 7.1, 7.2, eap6.0, 6.1, jpp6.0, etc. Without a set of jars that can communicate with all of these servers, our tools will need to implement drastic workarounds or bundle several versions of the app server's jars within it.
It's interesting to me that the as7.1 jars work against everything except eap6.1, and yet, the eap6.1 jars work against everything except as7.0.0.