]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: epoll: skip reports of stale file descriptors
authorWilly Tarreau <w@1wt.eu>
Thu, 30 Jan 2025 15:32:35 +0000 (16:32 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 30 Jan 2025 18:45:34 +0000 (19:45 +0100)
Now that we can see that some events are reported for older instances
of a file descriptor, let's skip these ones instead of reporting
dangerous events on them. It might possibly qualify as a bug if it
helps fixing strange issues in certain environments, in which case it
can make sense to backport it along with the following recent patches:

  DEBUG: fd: add a counter of takeovers of an FD since it was last opened
  MINOR: fd: add a generation number to file descriptors
  DEBUG: epoll: store and compare the FD's generation count with reported event

src/ev_epoll.c

index 02ac0ff95c975335ca60f237d0ecc22d07076863..21770aa35eccdf5a2939ab5dbceca2fbe37685e2 100644 (file)
@@ -266,7 +266,9 @@ static void _do_poll(struct poller *p, int exp, int wake)
                fd_gen = _HA_ATOMIC_LOAD(&fdtab[fd].generation);
 
                if (unlikely(ev_gen != fd_gen)) {
-                       /* this is a stale report for an older instance of this FD */
+                       /* this is a stale report for an older instance of this FD,
+                        * we must ignore it.
+                        */
 
                        if (_HA_ATOMIC_LOAD(&fdtab[fd].owner)) {
                                ulong tmask = _HA_ATOMIC_LOAD(&fdtab[fd].thread_mask);
@@ -297,6 +299,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
                        } else {
                                COUNT_IF(1, "epoll report of event on a just closed fd (harmless)");
                        }
+                       continue;
                }
 
                if ((e & EPOLLRDHUP) && !(cur_poller.flags & HAP_POLL_F_RDHUP))