You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Eric (JIRA)" <ji...@apache.org> on 2010/07/30 10:32:53 UTC

[jira] Commented: (AMQ-2771) Side effect from AMQ-2094, server listens on host name address, client connects to localhost with the same URI

    [ https://issues.apache.org/activemq/browse/AMQ-2771?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=60996#action_60996 ] 

Eric commented on AMQ-2771:
---------------------------

An other side effect of the change, concerns multicast discovery.
 
- 2 distinct brokers are on the same server with MulticastDiscovery, a third one is on another server
- the first has a transport connector with "address:port?useLocalHost=false" (binding on the address;port is a security choice) + Multicast Discovery,
- the second and the third have the corresponding network connector, 

the second broker doesn't succeed in connecting to the first one. The third one is OK.

Example :
<transportConnector name="TestDeCharge-DEFAULT-IN"
uri="tcp://td0sib01s.priv.atos.fr:61616?useLocalHost=false"
discoveryUri="multicast://default?group=TestDeCharge-DEFAULT"/>

In 5.3.0, the corresponding multicast frame is

[root@td0sib01s ~]# tcpdump -s 200 -c 4 src host td0sib01s and ip multicast -X
09:59:02.870809 IP td0sib01s.priv.atos.fr.6155 > 239.255.2.3.6155: UDP, length 102
0x0000: 4500 0082 0000 4000 0111 959b 0a18 e7b5 E.....@.........
0x0010: efff 0203 180b 180b 006e e44f 5465 7374 .........n.OTest
0x0020: 4465 4368 6172 6765 2d44 4546 4155 4c54 DeCharge-DEFAULT
0x0030: 2e41 6374 6976 654d 512d 342e 616c 6976 .ActiveMQ-4.aliv
0x0040: 652e 256c 6f63 616c 686f 7374 2574 6370 e.%localhost%tcp
0x0050: 3a2f 2f74 6430 7369 6230 3173 2e70 7269 ://td0sib01s.pri
0x0060: 762e 6174 6f73 2e66 723a 3631 3631 363f v.atos.fr:61616?
0x0070: 7573 654c 6f63 616c 486f 7374 3d66 616c useLocalHost=fal
0x0080: 7365 se


In 5.3.2, the corresponding multicast frame is


tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 200 bytes
09:51:30.818735 IP td0sib01s.priv.atos.fr.6155 > 239.255.2.3.6155: UDP, length 83
0x0000: 4500 006f 0000 4000 0111 95ae 0a18 e7b5 E..o..@.........
0x0010: efff 0203 180b 180b 005b e43c 5465 7374 .........[.<Test
0x0020: 4465 4368 6172 6765 2d44 4546 4155 4c54 DeCharge-DEFAULT
0x0030: 2e41 6374 6976 654d 512d 342e 616c 6976 .ActiveMQ-4.aliv
0x0040: 652e 256c 6f63 616c 686f 7374 2574 6370 e.%localhost%tcp
0x0050: 3a2f 2f74 6430 7369 6230 3173 2e70 7269 ://td0sib01s.pri
0x0060: 762e 6174 6f73 2e66 723a 3631 3631 36 v.atos.fr:61616


In 5.3.2 Multicast frame doesn't contain the option "?useLocalHost=false", so, with this resolveHostName the network connector tries to use "localhost" to connect.

Eric-AWL

> Side effect from AMQ-2094, server listens on host name address, client connects to localhost with the same URI
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: AMQ-2771
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2771
>             Project: ActiveMQ
>          Issue Type: Wish
>    Affects Versions: 5.3.0, 5.3.1, 5.3.2
>            Reporter: Przemek Bruski
>             Fix For: 5.4.1
>
>         Attachments: BrokerServiceResolveHostTest.java
>
>
> TcpTransport.java contains the following code:
> {code}
>     protected String resolveHostName(String host) throws UnknownHostException {
>         String localName = InetAddress.getLocalHost().getHostName();
>         if (localName != null && isUseLocalHost()) {
>             if (localName.equals(host)) {
>                 return "localhost";
>             }
>         }
>         return host;
>     }
> {code}
> TcpTransportServer.java contains the following code:
> {code}
>         InetAddress addr = InetAddress.getByName(host);
>         try {
>             this.serverSocket = serverSocketFactory.createServerSocket(bind.getPort(), backlog, addr);
> {code}
> /etc/hosts looks like this:
> {code}
> 127.0.0.1       localhost.localdomain   localhost
> someip       myhostname.mydomain myhostname
> {code}
> Now, if I start server with uri: myhostname.mydomain, the server will listen on someip but the client started on the same host with the same uri will try connect to localhost (and fail).
> I know that useLocalHost can be used to avoid it, but silently connecting to localhost is counterintuitive and does not sound like a valid default behaviour (according to documentation, using localhost instead of the host name is a workaround, the workaround is now effectively default behaviour and breaks valid setups that used to work with 5.2).
> This worked fine on 5.2, since the server bound to all interfaces - but fixing this was obviously the right thing to do.
> Questions:
> 1. Can the default behaviour be changed to one that would work on majority of systems?
> 2. Is the workaround really needed? Maybe it's the local network settings that should be corrected?
> 3. The debug messages are misleading and probably should be changed:
> [ActiveMQ Task] [FailoverTransport:604] urlList connectionList:[tcp://hostname:54663?wireFormat.maxInactivityDuration=300000]
> [ActiveMQ Task] [FailoverTransport:723] Attempting connect to: tcp://hostname:54663?wireFormat.maxInactivityDuration=300000
> [ActiveMQ Task] [FailoverTransport:764] Connect fail to: tcp://hostname:54663?wireFormat.maxInactivityDuration=300000, reason: java.net.ConnectException: Connection refused
> In fact, it was the connection to localhost:54663 that was refused.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.