MINOR: fd: add a generation number to file descriptors

This patch adds a counter of close() on file descriptors in the fdtab.
The goal is to better detect if reported events concern the current or
a previous file descriptor. For now the counter is only added, and is
showed in "show fd" as "gen". We're reusing unused space at the end of
the struct. If it's needed for something more important later, this
patch can be reverted.
This commit is contained in:
Willy Tarreau 2025-01-30 16:25:40 +01:00
parent 44ac7a7e73
commit d155924efe
3 changed files with 6 additions and 2 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);
}