Search in sources :

Example 61 with Node

use of org.mobicents.tools.heartbeat.api.Node in project load-balancer by RestComm.

the class PureConsistentHashBalancerAlgorithm method hashAffinityKeyword.

@Override
protected int hashAffinityKeyword(String keyword, Boolean isIpV6) {
    int hashCode = Math.abs(keyword.hashCode());
    // take a copy to avoid inconsistent reads
    Object[] nodes = nodesArray(isIpV6);
    int lastNodeWithLowerHash = 0;
    for (int q = 0; q < nodes.length; q++) {
        Node node = (Node) nodes[q];
        Integer nodeHash = nodeToHash.get(node);
        if (nodeHash == null)
            nodeHash = 0;
        if (hashCode > nodeHash) {
            lastNodeWithLowerHash = q;
        } else {
            return q;
        }
    }
    // the request hash exceeds all node hashes
    return lastNodeWithLowerHash;
}
Also used : Node(org.mobicents.tools.heartbeat.api.Node)

Example 62 with Node

use of org.mobicents.tools.heartbeat.api.Node in project load-balancer by RestComm.

the class RouterImpl method getNextHop.

public Hop getNextHop(Request request) throws SipException {
    String callID = ((CallID) request.getHeader(CallID.NAME)).getCallId();
    Node node = null;
    Hop hop = null;
    String transport = ((ViaHeader) request.getHeader(ViaHeader.NAME)).getTransport().toLowerCase();
    String method = request.getMethod();
    if (method.equals(Request.INVITE) || method.equals(Request.SUBSCRIBE)) {
        node = register.stickSessionToNode(callID, null);
    } else if (method.equals(Request.BYE) || method.equals(Request.CANCEL)) {
        // We have to clean, other side wants to go BYE ;/
        node = register.getGluedNode(callID);
        if (node == null) {
            for (int i = 0; i < 5 && node == null; i++) {
                try {
                    node = register.getNextNode();
                } catch (IndexOutOfBoundsException ioobe) {
                }
            }
        }
    } else {
        node = register.getGluedNode(callID);
        if (node == null)
            for (int i = 0; i < 5 && node == null; i++) {
                try {
                    node = register.getNextNode();
                } catch (IndexOutOfBoundsException ioobe) {
                }
            }
    }
    Integer port = Integer.parseInt(node.getProperties().get(transport + "Port"));
    if (port == null) {
        throw new RuntimeException("No port available for transport " + transport + " for node " + node);
    }
    hop = new HopImpl(node.getIp(), port, transport);
    System.out.println(this.getClass().getName() + ".getNextHop() returning hop:" + hop);
    return hop;
}
Also used : CallID(gov.nist.javax.sip.header.CallID) Node(org.mobicents.tools.heartbeat.api.Node) Hop(javax.sip.address.Hop) HopImpl(gov.nist.javax.sip.stack.HopImpl)

Example 63 with Node

use of org.mobicents.tools.heartbeat.api.Node in project load-balancer by RestComm.

the class SIPBalancerForwarder method getSenderNode.

// private Node getTransactionSourceNode(Response response) {
// ViaHeader viaHeader = ((ViaHeader)response.getHeader(ViaHeader.NAME));
// String host = viaHeader.getHost();
// String transport = viaHeader.getTransport();
// if(transport == null) transport = ListeningPoint.UDP;
// transport = transport.toLowerCase();
// int port = viaHeader.getPort();
// if(extraServerAddresses != null) {
// for(int q=0; q<extraServerAddresses.length; q++) {
// if(extraServerAddresses[q].equals(host) && extraServerPorts[q] == port) {
// return ExtraServerNode.extraServerNode;
// }
// }
// }
// Node node = getNodeDeadOrAlive(host, port, transport);
// if(node != null) {
// return node;
// }
// return null;
// }
private Node getSenderNode(Response response) {
    SIPResponse resp = (SIPResponse) response;
    String host = resp.getRemoteAddress().getHostAddress();
    ViaHeader viaHeader = ((ViaHeader) response.getHeader(ViaHeader.NAME));
    String currentTransport = viaHeader.getTransport();
    String transport = null;
    if (balancerRunner.balancerContext.internalTransport != null) {
        if (logger.isDebugEnabled()) {
            logger.debug("Set internal transport for getting sender Node: " + balancerRunner.balancerContext.internalTransport);
        }
        transport = balancerRunner.balancerContext.internalTransport;
    } else if (balancerRunner.balancerContext.terminateTLSTraffic) {
        if (currentTransport.equalsIgnoreCase(ListeningPoint.TLS))
            transport = ListeningPoint.TCP;
        else if (currentTransport.equalsIgnoreCase(ListeningPointExt.WSS))
            transport = ListeningPointExt.WS;
        else
            transport = currentTransport;
    } else {
        transport = currentTransport;
    }
    if (transport == null)
        transport = ListeningPoint.UDP;
    int port = resp.getRemotePort();
    if (extraServerAddresses != null) {
        for (int q = 0; q < extraServerAddresses.length; q++) {
            if (extraServerAddresses[q].equals(host) && extraServerPorts[q] == port) {
                return ExtraServerNode.extraServerNode;
            }
        }
    }
    Node node = getNodeDeadOrAlive(host, port, transport);
    if (node != null) {
        return node;
    }
    return null;
}
Also used : SIPResponse(gov.nist.javax.sip.message.SIPResponse) ViaHeader(javax.sip.header.ViaHeader) Node(org.mobicents.tools.heartbeat.api.Node) ListeningPoint(javax.sip.ListeningPoint)

Example 64 with Node

use of org.mobicents.tools.heartbeat.api.Node in project load-balancer by RestComm.

the class HeaderConsistentHashBalancerAlgorithm method processExternalResponse.

public void processExternalResponse(Response response, InvocationContext context, Boolean isIpV6) {
    Via via = (Via) response.getHeader(Via.NAME);
    String transport = via.getTransport().toLowerCase();
    Integer nodeIndex = hashHeader(response, isIpV6);
    String host = via.getHost();
    Integer port = via.getPort();
    Boolean found = false;
    // }
    if (context.sipNodeMap(isIpV6).containsKey(new KeySip(host, port, isIpV6)))
        found = true;
    if (logger.isDebugEnabled()) {
        logger.debug("external response node found ? " + found);
    }
    if (!found) {
        if (nodesAreDirty) {
            synchronized (this) {
                syncNodes(isIpV6);
            }
        }
        try {
            Node node = (Node) nodesArray(isIpV6)[nodeIndex];
            // if(node == null || !context.nodes.contains(node)) {
            if (node == null || !context.sipNodeMap(isIpV6).containsValue(node)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("No node to handle " + via);
                }
            } else {
                String transportProperty = transport + "Port";
                port = Integer.parseInt(node.getProperties().get(transportProperty));
                if (via.getHost().equalsIgnoreCase(node.getIp()) || via.getPort() != port) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("changing retransmission via " + via + "setting new values " + node.getIp() + ":" + port);
                    }
                    try {
                        via.setHost(node.getIp());
                        via.setPort(port);
                    } catch (Exception e) {
                        throw new RuntimeException("Error setting new values " + node.getIp() + ":" + port + " on via " + via, e);
                    }
                    // need to reset the rport for reliable transports
                    if (!ListeningPoint.UDP.equalsIgnoreCase(transport)) {
                        via.setRPort();
                    }
                }
            }
        } catch (Exception e) {
        }
    }
}
Also used : Node(org.mobicents.tools.heartbeat.api.Node) Via(gov.nist.javax.sip.header.Via)

Example 65 with Node

use of org.mobicents.tools.heartbeat.api.Node in project load-balancer by RestComm.

the class HeaderConsistentHashBalancerAlgorithm method hashAffinityKeyword.

protected int hashAffinityKeyword(String keyword, Boolean isIpV6) {
    int nodeIndex = Math.abs(keyword.hashCode()) % nodesArray(isIpV6).length;
    Node computedNode = (Node) nodesArray(isIpV6)[nodeIndex];
    if (!isAlive(computedNode)) {
        // If the computed node is dead, find a new one
        for (int q = 0; q < nodesArray(isIpV6).length; q++) {
            nodeIndex = (nodeIndex + 1) % nodesArray(isIpV6).length;
            if (isAlive(((Node) nodesArray(isIpV6)[nodeIndex]))) {
                break;
            }
        }
    }
    return nodeIndex;
}
Also used : Node(org.mobicents.tools.heartbeat.api.Node) ListeningPoint(javax.sip.ListeningPoint)

Aggregations

Node (org.mobicents.tools.heartbeat.api.Node)70 ListeningPoint (javax.sip.ListeningPoint)19 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)11 Via (gov.nist.javax.sip.header.Via)7 HashMap (java.util.HashMap)7 SIPHeader (gov.nist.javax.sip.header.SIPHeader)6 ParseException (java.text.ParseException)6 ArrayList (java.util.ArrayList)6 ViaHeader (javax.sip.header.ViaHeader)6 RouteHeader (javax.sip.header.RouteHeader)5 SIPResponse (gov.nist.javax.sip.message.SIPResponse)4 UnknownHostException (java.net.UnknownHostException)4 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)4 InvalidArgumentException (javax.sip.InvalidArgumentException)4 SipException (javax.sip.SipException)4 SipURI (javax.sip.address.SipURI)4 RecordRouteHeader (javax.sip.header.RecordRouteHeader)4 ToHeader (javax.sip.header.ToHeader)4 Response (javax.sip.message.Response)4 Test (org.junit.Test)4