[jboss-jira] [JBoss JIRA] (WFLY-13132) Wrong/Incomplete CLUSTER_TOPOLOGY update sent to EJB client

Richard Achmatowicz (Jira) issues at jboss.org
Tue Apr 28 16:21:20 EDT 2020


    [ https://issues.redhat.com/browse/WFLY-13132?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14064670#comment-14064670 ] 

Richard Achmatowicz commented on WFLY-13132:
--------------------------------------------

I think the simplest way to deal with this is to enforce a default behaviour of one protocol per proxy instance, which is effectively what we had before the possibility of having two EJB remote connectors became available. Each time a proxy is created, it has an 
{noformat}
String initialProtocol = null ;
{noformat}
setting in the EJBInvocationHandler. When a target is chosen, this gets initialised with the protocol used in the first target. Thereafter, any candidate for a target needs to have a protocol which matches the value in initialProtocol; if there is no such target, the invocation fails. Both the NamingEJBClientInterceptor and the DiscoveryEJBClientInterceptor can be modified to check this value before assigning a destination. In particular, discovery can make use of a new filterspec variable for the protocol so that searches only return values which match the given protocol.

The only problem is how to select the first invocation target (for the generation 4.x EJB client) when there are two or more possibilities available. This choice could be based on a number of possible calculations:
* the protocol used in any JNDI PROVIDER_URL
* the protocol used in any configured connections in wildfly-config.xml which end up in the EJBClientContext
* a specific setting in the EJBClientContext, such as "preferProtocol="remote|remote+http|remote+https" where the protocols are ordered in preference 
* a simple setting like "preferlegacyProtocol=true" to indicate a preference of "remote" over "remote+http" or "remote+https"
Just some ideas.


 



> Wrong/Incomplete CLUSTER_TOPOLOGY update sent to EJB client
> -----------------------------------------------------------
>
>                 Key: WFLY-13132
>                 URL: https://issues.redhat.com/browse/WFLY-13132
>             Project: WildFly
>          Issue Type: Bug
>          Components: EJB
>    Affects Versions: 19.0.0.Beta2
>            Reporter: Joerg Baesner
>            Assignee: Richard Achmatowicz
>            Priority: Major
>              Labels: downstream_dependency
>         Attachments: playground.zip
>
>
> h2. +Issue+
> h3. +General Client setup:+
> {code:java}
>     Properties p = new Properties();
>     p.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
>     p.put(Context.PROVIDER_URL, {see below});
>     p.put(Context.SECURITY_PRINCIPAL, USER);
>     p.put(Context.SECURITY_CREDENTIALS, PWD);
>     Context context = new InitialContext(p);
> {code}
> ----
> h3. +Standard server configuration:+
> {code:xml}
>     <subsystem xmlns="urn:jboss:domain:ejb3:5.0">
>         ...
>         <remote connector-ref="http-remoting-connector" thread-pool-name="default">
>             <channel-creation-options>
>                 <option name="READ_TIMEOUT" value="${prop.remoting-connector.read.timeout:20}" type="xnio"/>
>                 <option name="MAX_OUTBOUND_MESSAGES" value="1234" type="remoting"/>
>             </channel-creation-options>
>         </remote>
>         ...
>     </subsystem>
>     ...
>     <subsystem xmlns="urn:jboss:domain:remoting:4.0">
>         <connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm">
>             <properties>
>                 <property name="SSL_ENABLED" value="false"/>
>             </properties>
>         </connector>
>         <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/>
>     </subsystem>
> {code}
> h5. +invocation from remote client to server with:+
> * {{remote://localhost:4447}}
> * {{remote+http://localhost:8080}}
> h5. +Client side topology update always:+
> {noformat}
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message from node master:app-cluster-node0, registering cluster ejb to node master:app-cluster-node0
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message block from master:app-cluster-node0, registering block ::/0 to address 127.0.0.1:8080
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message from node master:app-cluster-node0, registering cluster ejb to node master:app-cluster-node1
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message block from master:app-cluster-node0, registering block ::/0 to address 127.0.0.1:8180
> DEBUG (XNIO-1 task-1) [org.jboss.ejb.client.invocation] Received MODULE_AVAILABLE(8) message from node master:app-cluster-node0 for module playground-app/playground-app-web
> DEBUG (XNIO-1 task-1) [org.jboss.ejb.client.invocation] Received MODULE_AVAILABLE(8) message from node master:app-cluster-node0 for module playground-app/playground-app-ejb
> {noformat}
> ----
> h3. +Legacy server configuration:+
> {code:xml}
>     <subsystem xmlns="urn:jboss:domain:ejb3:5.0">
>         ...
>         <remote connector-ref="remoting-connector" thread-pool-name="default">
>             <channel-creation-options>
>                 <option name="READ_TIMEOUT" value="${prop.remoting-connector.read.timeout:20}" type="xnio"/>
>                 <option name="MAX_OUTBOUND_MESSAGES" value="1234" type="remoting"/>
>             </channel-creation-options>
>         </remote>
>         ...
>     </subsystem>
>     ...
>     <subsystem xmlns="urn:jboss:domain:remoting:4.0">
>         <connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm">
>             <properties>
>                 <property name="SSL_ENABLED" value="false"/>
>             </properties>
>         </connector>
>         <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/>
>     </subsystem>
> {code}
> h5. +invocation from remote client to server with:+
> * {{remote://localhost:4447}}
> * {{remote+http://localhost:8080}}
> h5. +Client side topology update always:+
> {noformat}
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message from node master:app-cluster-node0, registering cluster ejb to node master:app-cluster-node0
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message block from master:app-cluster-node0, registering block ::/0 to address 127.0.0.1:4447
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message from node master:app-cluster-node0, registering cluster ejb to node master:app-cluster-node1
> DEBUG (XNIO-1 task-2) [org.jboss.ejb.client.invocation] Received CLUSTER_TOPOLOGY(15) message block from master:app-cluster-node0, registering block ::/0 to address 127.0.0.1:4547
> DEBUG (XNIO-1 task-1) [org.jboss.ejb.client.invocation] Received MODULE_AVAILABLE(8) message from node master:app-cluster-node0 for module playground-app/playground-app-web
> DEBUG (XNIO-1 task-1) [org.jboss.ejb.client.invocation] Received MODULE_AVAILABLE(8) message from node master:app-cluster-node0 for module playground-app/playground-app-ejb
> {noformat}
> h2. +Conclusion+
> Depending on what is configured as {{connector-ref}} in the {{remote}} of the _ejb3_ subsystem the {{CLUSTER_TOPOLOGY}} update is different. From a client perspective it would be expected that either the {{CLUSTER_TOPOLOGY}} update would _only_ contain destinations that are applicable for the  _connector/protocol_ that has been used, or maybe even _ALL_ available destinations, as the client could potentially run a mix of protocols between invocations...



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list