diff --git a/include/haproxy/fd-t.h b/include/haproxy/fd-t.h index c2b2aee20..5fa3689b4 100644 --- a/include/haproxy/fd-t.h +++ b/include/haproxy/fd-t.h @@ -198,6 +198,7 @@ struct fdtab { * if the room is needed for more important stuff. */ unsigned int nb_takeover; /* number of times this FD was taken over since inserted (used for debugging) */ + unsigned int generation; /* number of times this FD was closed before (used for epoll strengthening) */ #ifdef DEBUG_FD unsigned int event_count; /* number of events reported */ #endif diff --git a/src/cli.c b/src/cli.c index d00b5b241..84aa46fbe 100644 --- a/src/cli.c +++ b/src/cli.c @@ -1415,7 +1415,7 @@ static int cli_io_handler_show_fd(struct appctx *appctx) suspicious = 1; chunk_printf(&trash, - " %5d : st=0x%06x(%c%c %c%c%c%c%c W:%c%c%c R:%c%c%c) ref=%#x gid=%d tmask=0x%lx umask=0x%lx prmsk=0x%lx pwmsk=0x%lx owner=%p tkov=%u iocb=%p(", + " %5d : st=0x%06x(%c%c %c%c%c%c%c W:%c%c%c R:%c%c%c) ref=%#x gid=%d tmask=0x%lx umask=0x%lx prmsk=0x%lx pwmsk=0x%lx owner=%p gen=%u tkov=%u iocb=%p(", fd, fdt.state, (fdt.state & FD_CLONED) ? 'C' : 'c', @@ -1437,6 +1437,7 @@ static int cli_io_handler_show_fd(struct appctx *appctx) polled_mask[fd].poll_recv, polled_mask[fd].poll_send, fdt.owner, + fdt.generation, fdt.nb_takeover, fdt.iocb); resolve_sym_name(&trash, NULL, fdt.iocb); diff --git a/src/fd.c b/src/fd.c index bf4241ba2..97d58e797 100644 --- a/src/fd.c +++ b/src/fd.c @@ -355,8 +355,10 @@ void _fd_delete_orphan(int fd) /* perform the close() call last as it's what unlocks the instant reuse * of this FD by any other thread. */ - if (!fd_disown) + if (!fd_disown) { + fdtab[fd].generation++; close(fd); + } _HA_ATOMIC_DEC(&ha_used_fds); }