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();

Reply via email to