From cf29e33e3e2d3732fb202eea052235a4b5ebebc7 Mon Sep 17 00:00:00 2001 From: jfclere Date: Fri, 9 Oct 2009 16:00:20 +0000 Subject: [PATCH] Add a local bind otherwise for box with multi IP httpd may use the wrong port. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@823603 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/ha/backend/CollectedInfo.java | 25 +++++++++++++++------- .../catalina/ha/backend/HeartbeatListener.java | 21 +++++++++++------- .../catalina/ha/backend/MultiCastSender.java | 9 +++++++- java/org/apache/catalina/ha/backend/TcpSender.java | 12 ++++++++++- 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/java/org/apache/catalina/ha/backend/CollectedInfo.java b/java/org/apache/catalina/ha/backend/CollectedInfo.java index 31274398a..1866a0d21 100644 --- a/java/org/apache/catalina/ha/backend/CollectedInfo.java +++ b/java/org/apache/catalina/ha/backend/CollectedInfo.java @@ -44,11 +44,15 @@ public class CollectedInfo { int ready; int busy; + int port = 0; + String host = null; + public CollectedInfo(String host, int port) throws Exception { init(host, port); } public void init(String host, int port) throws Exception { - String sport = Integer.toString(port); + int iport = 0; + String shost = null; mBeanServer = Registry.getRegistry(null, null).getMBeanServer(); String onStr = "*:type=ThreadPool,*"; ObjectName objectName = new ObjectName(onStr); @@ -58,24 +62,29 @@ public class CollectedInfo { ObjectInstance oi = iterator.next(); objName = oi.getObjectName(); String name = objName.getKeyProperty("name"); + /* Name are: * http-8080 * jk-10.33.144.3-8009 * jk-jfcpc%2F10.33.144.3-8009 */ + String [] elenames = name.split("-"); + String sport = elenames[elenames.length-1]; + iport = Integer.parseInt(sport); + String [] shosts = elenames[1].split("%2F"); + shost = shosts[0]; + if (port==0 && host==null) break; /* Take the first one */ - String [] elenames = name.split("-"); - if (elenames[elenames.length-1].compareTo(sport) != 0) - continue; /* port doesn't match */ - if (host==null) + if (host==null && iport==port) break; /* Only port done */ - String [] shosts = elenames[1].split("%2F"); - if (shosts[0].compareTo(host) == 0) + if (shost.compareTo(host) == 0) break; /* Done port and host are the expected ones */ } if (objName == null) - throw(new Exception("Can't find connector for " + host + ":" + sport)); + throw(new Exception("Can't find connector for " + host + ":" + port)); + this.port = iport; + this.host = shost; } diff --git a/java/org/apache/catalina/ha/backend/HeartbeatListener.java b/java/org/apache/catalina/ha/backend/HeartbeatListener.java index cecba3f7d..bc5bb2592 100644 --- a/java/org/apache/catalina/ha/backend/HeartbeatListener.java +++ b/java/org/apache/catalina/ha/backend/HeartbeatListener.java @@ -85,26 +85,31 @@ public class HeartbeatListener sender = new MultiCastSender(); else sender = new TcpSender(); - - try { - sender.init(this); - } catch (Exception ex) { - log.error("Unable to initialize Sender: " + ex); - sender = null; - return; - } } /* Read busy and ready */ if (coll == null) { try { coll = new CollectedInfo(host, port); + this.port = coll.port; + this.host = coll.host; } catch (Exception ex) { log.error("Unable to initialize info collection: " + ex); coll = null; return; } } + + /* Start or restart sender */ + try { + sender.init(this); + } catch (Exception ex) { + log.error("Unable to initialize Sender: " + ex); + sender = null; + return; + } + + /* refresh the connector information and send it */ try { coll.refresh(); } catch (Exception ex) { diff --git a/java/org/apache/catalina/ha/backend/MultiCastSender.java b/java/org/apache/catalina/ha/backend/MultiCastSender.java index 558a2f26d..63f51dbe6 100644 --- a/java/org/apache/catalina/ha/backend/MultiCastSender.java +++ b/java/org/apache/catalina/ha/backend/MultiCastSender.java @@ -23,6 +23,7 @@ import org.apache.juli.logging.LogFactory; import java.net.MulticastSocket; import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.DatagramPacket; import java.io.UnsupportedEncodingException; @@ -48,7 +49,13 @@ public class MultiCastSender if (s == null) { try { group = InetAddress.getByName(config.getGroup()); - s = new MulticastSocket(config.getMultiport()); + if (config.host != null) { + InetAddress addr = InetAddress.getByName(config.host); + InetSocketAddress addrs = new InetSocketAddress(addr, config.getMultiport()); + s = new MulticastSocket(addrs); + } else + s = new MulticastSocket(config.getMultiport()); + s.setTimeToLive(config.getTtl()); s.joinGroup(group); } catch (Exception ex) { diff --git a/java/org/apache/catalina/ha/backend/TcpSender.java b/java/org/apache/catalina/ha/backend/TcpSender.java index cb0726a76..06dab1ec0 100644 --- a/java/org/apache/catalina/ha/backend/TcpSender.java +++ b/java/org/apache/catalina/ha/backend/TcpSender.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.Socket; import java.util.StringTokenizer; @@ -90,7 +91,16 @@ public class TcpSender for (int i = 0; i < connections.length; i++) { if (connections[i] == null) { try { - connections[i] = new Socket(proxies[i].address, proxies[i].port); + if (config.host != null) { + connections[i] = new Socket(); + InetAddress addr = InetAddress.getByName(config.host); + InetSocketAddress addrs = new InetSocketAddress(addr, 0); + connections[i].setReuseAddress(true); + connections[i].bind(addrs); + addrs = new InetSocketAddress(proxies[i].address, proxies[i].port); + connections[i].connect(addrs); + } else + connections[i] = new Socket(proxies[i].address, proxies[i].port); connectionReaders[i] = new BufferedReader(new InputStreamReader(connections[i].getInputStream())); connectionWriters[i] = new BufferedWriter(new OutputStreamWriter(connections[i].getOutputStream())); } catch (Exception ex) { -- 2.11.0