You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Francesco Nigro (Jira)" <ji...@apache.org> on 2021/02/24 16:38:00 UTC

[jira] [Comment Edited] (ARTEMIS-3138) Shared Nothing Live broker shouldn't try to connect to itself

    [ https://issues.apache.org/jira/browse/ARTEMIS-3138?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17290060#comment-17290060 ] 

Francesco Nigro edited comment on ARTEMIS-3138 at 2/24/21, 4:37 PM:
--------------------------------------------------------------------

I'm now using a third approach, that seems the simpler/cleaner one: ClusterManager::deployClusterConnection can use the broker connector configuration to allow ClusterController's ServerLocator to filter the discovery connectors and save the broker one to be tried.

Firsts tests shows that the broker is producing many unlogged 
{code:java}
AMQ219024: Could not select a TransportConfiguration to create SessionFactory
{code}

on the ConnectRunnable::run called on intervals.
Despite being correct we could save producing the exception in case of missing connector proposals.





was (Author: nigrofranz):
I'm now using a third approach, that seems the simpler/cleaner one: ClusterManager::deployClusterConnection can use the broker connector configuration to allow ClusterController's ServerLocator to filter the discovery connectors and save the broker one to be tried.

Firsts tests shows that the broker is producing many unlogged 
{code:java}
AMQ219024: Could not select a TransportConfiguration to create SessionFactory
{code}

on the ConnectRunnable::run called on intervals.




> Shared Nothing Live broker shouldn't try to connect to itself
> -------------------------------------------------------------
>
>                 Key: ARTEMIS-3138
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-3138
>             Project: ActiveMQ Artemis
>          Issue Type: Improvement
>            Reporter: Francesco Nigro
>            Priority: Major
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> While starting a shared nothing master broker configured with discovery it performs discovery operations that could end up connecting the broker to itself.
>  The discoveries happen in different code paths:
>  * while checking for a live server 
>  * on cluster manager deploy
> Because the broker can receive its same broadcast connector transport and for some reason it won't filter it out.
> The existing logic to filter out connectors is based on the Node ID source of the broadcast event vs the one on the local server locator.
>  
> The former case won't end up connecting the broker to itself, because the broker acceptors are still closed and won't accept any connection, while the latter yes and the established connection remain alive for the whole broker life-time.
> The relevant stack traces are:
> {code:java}
> 	at org.apache.activemq.artemis.core.cluster.DiscoveryGroup.<init>(DiscoveryGroup.java:96)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createDiscoveryGroup(ServerLocatorImpl.java:298)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.startDiscovery(ServerLocatorImpl.java:275)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.initialize(ServerLocatorImpl.java:263)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:650)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.connect(ServerLocatorImpl.java:549)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.connectNoWarnings(ServerLocatorImpl.java:555)
> 	at org.apache.activemq.artemis.core.server.impl.SharedNothingLiveActivation.isNodeIdUsed(SharedNothingLiveActivation.java:331)
> 	at org.apache.activemq.artemis.core.server.impl.SharedNothingLiveActivation.run(SharedNothingLiveActivation.java:102)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.internalStart(ActiveMQServerImpl.java:634)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.start(ActiveMQServerImpl.java:558)
> 	at org.apache.activemq.artemis.integration.FileBroker.start(FileBroker.java:64)
> 	at org.apache.activemq.artemis.cli.commands.Run.execute(Run.java:115)
> 	at org.apache.activemq.artemis.cli.Artemis.internalExecute(Artemis.java:154)
> 	at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:102)
> 	at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:129)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:498)
> 	at org.apache.activemq.artemis.boot.Artemis.execute(Artemis.java:134)
> 	at org.apache.activemq.artemis.boot.Artemis.main(Artemis.java:50)
> {code}
>  And
> {code:java}
> 	at org.apache.activemq.artemis.core.cluster.DiscoveryGroup.<init>(DiscoveryGroup.java:96)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createDiscoveryGroup(ServerLocatorImpl.java:298)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.startDiscovery(ServerLocatorImpl.java:275)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.initialize(ServerLocatorImpl.java:263)
> 	at org.apache.activemq.artemis.core.server.cluster.ClusterController.configAndAdd(ClusterController.java:230)
> 	at org.apache.activemq.artemis.core.server.cluster.ClusterController.addClusterConnection(ClusterController.java:197)
> 	at org.apache.activemq.artemis.core.server.cluster.ClusterManager.deployClusterConnection(ClusterManager.java:612)
> 	at org.apache.activemq.artemis.core.server.cluster.ClusterManager.deploy(ClusterManager.java:245)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.initialisePart1(ActiveMQServerImpl.java:3066)
> 	at org.apache.activemq.artemis.core.server.impl.SharedNothingLiveActivation.run(SharedNothingLiveActivation.java:114)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.internalStart(ActiveMQServerImpl.java:634)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.start(ActiveMQServerImpl.java:558)
> 	at org.apache.activemq.artemis.integration.FileBroker.start(FileBroker.java:64)
> 	at org.apache.activemq.artemis.cli.commands.Run.execute(Run.java:115)
> 	at org.apache.activemq.artemis.cli.Artemis.internalExecute(Artemis.java:154)
> 	at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:102)
> 	at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:129)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:498)
> 	at org.apache.activemq.artemis.boot.Artemis.execute(Artemis.java:134)
> 	at org.apache.activemq.artemis.boot.Artemis.main(Artemis.java:50)
> {code}
> On both cases, the same broker transport isn't ignored because the discovery has been started with a randomly generated Node ID on the server locator, instead of using the broker real Node ID.
> The subsequent cluster manager start, instead, set the broker Node ID on the sever locator while its cluster connection is activated and that's why it ignores its same connector.
> The relevant stack trace is:
> {code:java}
> 	at org.apache.activemq.artemis.core.cluster.DiscoveryGroup.<init>(DiscoveryGroup.java:96)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createDiscoveryGroup(ServerLocatorImpl.java:298)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.startDiscovery(ServerLocatorImpl.java:275)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.initialize(ServerLocatorImpl.java:263)
> 	at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.start(ServerLocatorImpl.java:477)
> 	at org.apache.activemq.artemis.core.server.cluster.impl.ClusterConnectionImpl.activate(ClusterConnectionImpl.java:680)
> 	at org.apache.activemq.artemis.core.server.cluster.impl.ClusterConnectionImpl.start(ClusterConnectionImpl.java:399)
> 	at org.apache.activemq.artemis.core.server.cluster.ClusterManager.start(ClusterManager.java:270)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.initialisePart2(ActiveMQServerImpl.java:3225)
> 	at org.apache.activemq.artemis.core.server.impl.SharedNothingLiveActivation.run(SharedNothingLiveActivation.java:118)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.internalStart(ActiveMQServerImpl.java:634)
> 	at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.start(ActiveMQServerImpl.java:558)
> 	at org.apache.activemq.artemis.integration.FileBroker.start(FileBroker.java:64)
> 	at org.apache.activemq.artemis.cli.commands.Run.execute(Run.java:115)
> 	at org.apache.activemq.artemis.cli.Artemis.internalExecute(Artemis.java:154)
> 	at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:102)
> 	at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:129)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:498)
> 	at org.apache.activemq.artemis.boot.Artemis.execute(Artemis.java:134)
> 	at org.apache.activemq.artemis.boot.Artemis.main(Artemis.java:50)
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)