mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 23:56:57 +02:00
This is a complement to previous fix for bug #399. The exclusion between the recv() and send() calls prevents send handlers from being called if rx readiness is reported. The DNS code can trigger this situations with threads where the fd_recv_ready() flag disappears between the test in dgram_fd_handler() and the second test in dns_resolve_recv() while a thread calls fd_cant_recv(), and this situation can sustain itself for a while. With 8 threads and an error in the socket queue, placing a printf on the return statement in dns_resolve_recv() scrolls very fast. Simply removing the "else" in dgram_fd_handler() addresses the issue. This fix must be backported as far as 1.6.
34 lines
718 B
C
34 lines
718 B
C
/*
|
|
* UDP protocol related functions
|
|
*
|
|
* Copyright 2014 Baptiste Assmann <bedis9@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*
|
|
*/
|
|
|
|
#include <types/global.h>
|
|
#include <types/fd.h>
|
|
#include <types/proto_udp.h>
|
|
|
|
#include <proto/fd.h>
|
|
|
|
/* datagram handler callback */
|
|
void dgram_fd_handler(int fd)
|
|
{
|
|
struct dgram_conn *dgram = fdtab[fd].owner;
|
|
|
|
if (unlikely(!dgram))
|
|
return;
|
|
|
|
if (fd_recv_ready(fd))
|
|
dgram->data->recv(dgram);
|
|
if (fd_send_ready(fd))
|
|
dgram->data->send(dgram);
|
|
|
|
return;
|
|
}
|