Revision: 16169
Author: vladimir.ralev
Date: Wed Jan 5 01:28:36 2011
Log: Update Issue 2250
fix regressions
http://code.google.com/p/mobicents/source/detail?r=16169
Modified:
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/BalancerContext.java
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/NodeRegisterImpl.java
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/SIPBalancerForwarder.java
/trunk/tools/sip-balancer/jar/src/test/java/org/mobicents/tools/sip/balancer/scalability/SprayingLoadBalancersWithIPLBAddressInViaHeader.java
=======================================
---
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/BalancerContext.java
Tue Jan 4 21:05:17 2011
+++
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/BalancerContext.java
Wed Jan 5 01:28:36 2011
@@ -1,5 +1,6 @@
package org.mobicents.tools.sip.balancer;
+import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
@@ -15,6 +16,13 @@
public class BalancerContext {
public CopyOnWriteArrayList<SIPNode> nodes;
+ /* We will store here all nodes we ever saw because we will need the
addresses to determine the
+ * direction of requests where a dead node is involved. Otherwise if a
node has died its address
+ * will be recognized as client address which is wrong. This only
affects config with single port SIP LB.
+ * If internalPort is set there is no problem because we use other means
to determine the direction.
+ */
+
+ public HashSet<SIPNode> allNodesEver = new HashSet<SIPNode>();
public ConcurrentHashMap<String, SIPNode> jvmRouteToSipNode;
public Object parameters;
=======================================
---
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/NodeRegisterImpl.java
Sun Jan 2 22:44:18 2011
+++
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/NodeRegisterImpl.java
Wed Jan 5 01:28:36 2011
@@ -295,6 +295,7 @@
if(balancerRunner.balancerContext.nodes.size() < 1) {
balancerRunner.balancerContext.nodes.add(pingNode);
balancerRunner.balancerContext.balancerAlgorithm.nodeAdded(pingNode);
+
balancerRunner.balancerContext.allNodesEver.add(pingNode);
if(logger.isLoggable(Level.INFO)) {
logger.info("NodeExpirationTimerTask Run
NSync["
=======================================
---
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/SIPBalancerForwarder.java
Tue Jan 4 21:05:17 2011
+++
/trunk/tools/sip-balancer/jar/src/main/java/org/mobicents/tools/sip/balancer/SIPBalancerForwarder.java
Wed Jan 5 01:28:36 2011
@@ -496,7 +496,7 @@
}
}
- private SIPNode getNode(String host, int port, String otherTransport) {
+ private SIPNode getAliveNode(String host, int port, String
otherTransport) {
otherTransport = otherTransport.toLowerCase();
for(SIPNode node : balancerRunner.balancerContext.nodes) {
if(host.equals(node.getHostName()) ||
host.equals(node.getIp())) {
@@ -505,6 +505,18 @@
}
}
}
+ return null;
+ }
+
+ private SIPNode getNodeDeadOrAlive(String host, int port, String
otherTransport) {
+ otherTransport = otherTransport.toLowerCase();
+ for(SIPNode node : balancerRunner.balancerContext.allNodesEver)
{
+ if(host.equals(node.getHostName()) ||
host.equals(node.getIp())) {
+ if((Integer)node.getProperties().get(otherTransport + "Port") == port)
{
+ return node;
+ }
+ }
+ }
return null;
}
@@ -521,7 +533,7 @@
}
}
}
- if(getNode(host, port, transport) != null) {
+ if(getAliveNode(host, port, transport) != null) {
return true;
}
return false;
@@ -541,8 +553,8 @@
}
}
}
- SIPNode node = getNode(host, port, transport);
- if(getNode(host, port, transport) != null) {
+ SIPNode node = getNodeDeadOrAlive(host, port, transport);
+ if(node != null) {
return node;
}
return null;
@@ -646,7 +658,7 @@
URI uri =
nextNodeHeader.getAddress().getURI();
if(uri instanceof SipURI) {
SipURI sipUri = (SipURI) uri;
- assignedNode = getNode(sipUri.getHost(), sipUri.getPort(),
transport);
+ assignedNode = getAliveNode(sipUri.getHost(), sipUri.getPort(),
transport);
if(logger.isLoggable(Level.FINEST)) {
logger.finest("Found SIP URI " + uri + " |Next node is " +
assignedNode);
}
@@ -666,7 +678,7 @@
} else {
SipURI sipUri =(SipURI)
request.getRequestURI();
//nextNodeInRequestUri = true;
- assignedNode = getNode(sipUri.getHost(), sipUri.getPort(),
transport);
+ assignedNode = getAliveNode(sipUri.getHost(), sipUri.getPort(),
transport);
}
if(logger.isLoggable(Level.FINEST)) {
logger.finest("Subsequent request -> Found Route Header " +
header + " |Next node is " + assignedNode);
@@ -674,7 +686,7 @@
} else {
SipURI sipUri =(SipURI)
request.getRequestURI();
//nextNodeInRequestUri = true;
- assignedNode =
getNode(sipUri.getHost(), sipUri.getPort(), transport);
+ assignedNode = getAliveNode(sipUri.getHost(), sipUri.getPort(),
transport);
if(logger.isLoggable(Level.FINEST)) {
logger.finest("NOT Subsequent request -> using sipUri " + sipUri
+ " |Next node is " + assignedNode);
}
=======================================
---
/trunk/tools/sip-balancer/jar/src/test/java/org/mobicents/tools/sip/balancer/scalability/SprayingLoadBalancersWithIPLBAddressInViaHeader.java
Tue Jan 4 21:05:17 2011
+++
/trunk/tools/sip-balancer/jar/src/test/java/org/mobicents/tools/sip/balancer/scalability/SprayingLoadBalancersWithIPLBAddressInViaHeader.java
Wed Jan 5 01:28:36 2011
@@ -3,6 +3,8 @@
import java.util.Properties;
import javax.sip.SipException;
+import javax.sip.address.SipURI;
+import javax.sip.header.RecordRouteHeader;
import junit.framework.TestCase;
@@ -144,6 +146,71 @@
assertNotNull(byeServer);
assertNotNull(ackServer);
}
+ AppServer ringingAppServer;
+ AppServer okAppServer;
+ public void testASactingAsUAC() throws Exception {
+
+ EventListener failureEventListener = new EventListener() {
+
+ @Override
+ public void uasAfterResponse(int statusCode, AppServer
source) {
+
+
+ }
+
+ @Override
+ public void uasAfterRequestReceived(String method,
AppServer source) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void uacAfterRequestSent(String method,
AppServer source) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void uacAfterResponse(int statusCode, AppServer
source) {
+ if(statusCode == 180) {
+ ringingAppServer = source;
+ source.sendCleanShutdownToBalancers();
+ } else {
+ okAppServer = source;
+
+ }
+ }
+ };
+ for(AppServer as:servers)
as.setEventListener(failureEventListener);
+ shootist.callerSendsBye = true;
+
+ String fromName = "sender";
+ String fromHost = "sip-servlets.com";
+ SipURI fromAddress =
servers[0].protocolObjects.addressFactory.createSipURI(
+ fromName, fromHost);
+
+ String toUser = "replaces";
+ String toHost = "sip-servlets.com";
+ SipURI toAddress =
servers[0].protocolObjects.addressFactory.createSipURI(
+ toUser, toHost);
+
+ SipURI ruri =
servers[0].protocolObjects.addressFactory.createSipURI(
+ "usera", "127.0.0.1:5033");
+ ruri.setLrParam();
+ SipURI route =
servers[0].protocolObjects.addressFactory.createSipURI(
+ "lbaddress_noInternalPort", "127.0.0.1:5065");
+ route.setParameter("node_host", "127.0.0.1");
+ route.setParameter("node_port", "4060");
+ route.setLrParam();
+ shootist.start();
+ //servers[0].sipListener.sendSipRequest("INVITE", fromAddress,
toAddress, null, null, false);
+ servers[0].sipListener.sendSipRequest("INVITE", fromAddress, toAddress,
null, route, false, null, null, ruri);
+ Thread.sleep(16000);
+
assertTrue(shootist.inviteRequest.getHeader(RecordRouteHeader.NAME).toString().contains("node_host"));
+ assertNotSame(ringingAppServer, okAppServer);
+ assertNotNull(ringingAppServer);
+ assertNotNull(okAppServer);
+ }
public void testSprayingMultipleIndialogMessages() throws Exception {
shootist.callerSendsBye=true;
shootist.sendInitialInvite();