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/23 21:14:00 UTC

[jira] [Commented] (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=17289338#comment-17289338 ] 

Francesco Nigro commented on ARTEMIS-3138:
------------------------------------------

I see 2 different approaches to fix this:
# setting Node Id on the server locator on ClusterController.configAndAdd, while ClusterManager.deploy
# setting the broadcast group set of ClusterManager into server locator while creating the discovery group, to allow filtering anything received from them

The former one relies on the fact that discovery should always filter the node ID of who's live, while live (that's dependent by split brain, really).
The latter is more invasive, but precise, because it will check what's the source of the discovery into at IP level, matching the ones performing broadcasting on the same application, to filter them out.

> 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
>
> While starting a shared nothing master broker configured with discovery it performs discovery operations that could end up connecting the broker to itself.
>  
> This is happening 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 former won't end up connecting the broker to itself, because the broker acceptors are still closed, 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 will start, instead, setting the broker Node ID on the sever locator while its cluster connection is activated.
> 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)