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;
}
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;
}
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;
}
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) {
}
}
}
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;
}
Aggregations