package com.netflix.suro.connection;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerPing;
import com.netflix.loadbalancer.Server;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.net.SocketException;
/**
* Simple implementation for checking if a single server is alive
*
* @author zdexter
*/
public class SuroPing extends AbstractLoadBalancerPing {
private static Logger logger = LoggerFactory
.getLogger(SuroPing.class);
public SuroPing() {
}
private void close(@Nullable TTransport transport) {
if (transport == null) {
return;
}
transport.close();
}
public boolean isAlive(Server server) {
TSocket socket = null;
TFramedTransport transport = null;
try {
socket = new TSocket(server.getHost(), server.getPort(), 2000);
socket.getSocket().setTcpNoDelay(true);
socket.getSocket().setKeepAlive(true);
socket.getSocket().setSoLinger(true, 0);
transport = new TFramedTransport(socket);
transport.open();
return true;
} catch (TTransportException e) {
logger.warn("Ping {}", e.getMessage());
return false;
} catch (SocketException e) {
logger.warn("Ping {}", e.getMessage());
return false;
} finally {
close(transport);
close(socket);
}
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}