fluent / fluent/fluent-logger-java

Initial UnknownHostException is Unrecoverable

Abierto
#62 1 comentario 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Java
Estrellas
210
Forks
86
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

The `RawSocketSender` takes a host and port in its constructor and coverts these into an `InetSocketAddress`, which tries to resolve the hostname. On `RawSocketSender` connect this `InetSocketAddress` is used to reconnect, but if it wasn't resolved during fluent-logger init then it will fail over and over. The code snipped from `RawSocketSender` is below:

``` java
public RawSocketSender(String host, int port, int timeout, int bufferCapacity, Reconnector reconnector) {
msgpack = new MessagePack();
msgpack.register(Event.class, Event.EventTemplate.INSTANCE);
pendings = ByteBuffer.allocate(bufferCapacity);
server = new InetSocketAddress(host, port); // Create InetSocketAddress on init
this.reconnector = reconnector;
name = String.format("%s_%d_%d_%d", host, port, timeout, bufferCapacity);
this.timeout = timeout;
}

private void connect() throws IOException {
try {
socket = new Socket();
socket.connect(server, timeout); // Reconnection uses pre-resolved server field
out = new BufferedOutputStream(socket.getOutputStream());
} catch (IOException e) {
throw e;
}
}
```

This issue comes up when using the fluent-logger in a highly dynamic environment (like on Docker Swarm) where apps may come up before a DNS entry in Consul is even resolvable. It also means that during failover of a Fluent host (triggering a DNS change) the then failing socket connection will always try the old Fluent host IP and never re-resolve the DNS entry.

My recommendation is to store the Fluent host and port as private fields within the `RawSocketSender`, not a resolved `InetSocketAddress` (now stored as `this.server`) and create a new `InetSocketAddress` on every socket connection.

I understand there will be performance implications of this and am happy to submit a PR, but wanted to bring it up in an issue in case there were reasons for implementing the `RawSocketSender` the current way.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Línea de trabajo

Empieza por el constructor de RawSocketSender y su método connect(), especialmente por cómo se almacena y reutiliza la dirección del servidor. Verifica el comportamiento cuando falla la resolución inicial del nombre de host y cuando DNS cambia durante el failover; se considera terminado cuando la reconexión utiliza la resolución actual del nombre de host en lugar de una dirección resuelta antigua.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
java
Área
networking
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.