]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] move the listener reference from fd to session
authorWilly Tarreau <w@1wt.eu>
Sun, 7 Dec 2008 15:45:10 +0000 (16:45 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 7 Dec 2008 15:45:10 +0000 (16:45 +0100)
The listener referenced in the fd was only used to check the
listener state upon session termination. There was no guarantee
that the FD had not been reassigned by the moment it was processed,
so this was a bit racy. Having it in the session is more robust.

include/types/fd.h
include/types/session.h
src/client.c
src/proto_tcp.c
src/proto_uxst.c

index 97e14b14d45746b3b302d63c823a4b2111881c77..c413245e1bce91b3ebec33c41d0aed99ac382a23 100644 (file)
@@ -3,7 +3,7 @@
   File descriptors states.
 
   Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
-  
+
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation, version 2.1
@@ -70,7 +70,6 @@ struct fdtab {
        unsigned char ev;                    /* event seen in return of poll() : FD_POLL_* */
        struct sockaddr *peeraddr;           /* pointer to peer's network address, or NULL if unset */
        socklen_t peerlen;                   /* peer's address length, or 0 if unset */
-       struct listener *listener;           /* the listener which created this fd, or NULL if unset */
 };
 
 /*
index 574f93341b7c2c33f5d1e3e38d84a8222dc0184a..eaa053fbfbac858df2c31d3566295b60d6718d68 100644 (file)
@@ -155,6 +155,7 @@ struct session {
        struct list list;                       /* position in global sessions list */
        struct task *task;                      /* the task associated with this session */
        /* application specific below */
+       struct listener *listener;              /* the listener by which the request arrived */
        struct proxy *fe;                       /* the proxy this session depends on for the client side */
        struct proxy *be;                       /* the proxy this session depends on for the server side */
        int conn_retries;                       /* number of connect retries left */
index a01bb527e635c8e3c89b133b0511a66afaeb1fa9..a9625dac110b00c3e1208fdea13a2b91a512646e 100644 (file)
@@ -157,6 +157,7 @@ int event_accept(int fd) {
                t->context = s;
 
                s->task = t;
+               s->listener = l;
                s->be = s->fe = p;
 
                /* in HTTP mode, content switching requires that the backend
@@ -397,7 +398,6 @@ int event_accept(int fd) {
 
                fd_insert(cfd);
                fdtab[cfd].owner = &s->si[0];
-               fdtab[cfd].listener = l;
                fdtab[cfd].state = FD_STREADY;
                fdtab[cfd].cb[DIR_RD].f = l->proto->read;
                fdtab[cfd].cb[DIR_RD].b = s->req;
index ce0c43ac666ea42508be2c443d216bf9b22cafed..5a1424f3ab7f1dfc7dce800dc0795ac44151106b 100644 (file)
@@ -266,7 +266,6 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
        fdtab[fd].state = FD_STLISTEN;
        fdtab[fd].peeraddr = NULL;
        fdtab[fd].peerlen = 0;
-       fdtab[fd].listener = NULL;
  tcp_return:
        if (msg && errlen)
                strlcpy2(errmsg, msg, errlen);
index b3bf7545cd3ef6e7df7d6046901d9bd3907ea723..d7567509e00d06535104d8896e9920854bad4df9 100644 (file)
@@ -270,7 +270,6 @@ static int uxst_bind_listener(struct listener *listener)
        fdtab[fd].state = FD_STLISTEN;
        fdtab[fd].peeraddr = NULL;
        fdtab[fd].peerlen = 0;
-       fdtab[fd].listener = NULL;
        return ERR_NONE;
 }
 
@@ -438,6 +437,7 @@ int uxst_event_accept(int fd) {
                t->nice = -64;  /* we want to boost priority for local stats */
 
                s->task = t;
+               s->listener = l;
                s->fe = NULL;
                s->be = NULL;
 
@@ -518,7 +518,6 @@ int uxst_event_accept(int fd) {
 
                fd_insert(cfd);
                fdtab[cfd].owner = &s->si[0];
-               fdtab[cfd].listener = l;
                fdtab[cfd].state = FD_STREADY;
                fdtab[cfd].cb[DIR_RD].f = l->proto->read;
                fdtab[cfd].cb[DIR_RD].b = s->req;
@@ -695,7 +694,6 @@ int uxst_req_analyser_stats(struct session *s, struct buffer *req)
 void uxst_process_session(struct task *t, int *next)
 {
        struct session *s = t->context;
-       struct listener *listener;
        int resync;
        unsigned int rqf_last, rpf_last;
 
@@ -937,14 +935,13 @@ void uxst_process_session(struct task *t, int *next)
        }
 
        actconn--;
-       listener = fdtab[s->si[0].fd].listener;
-       if (listener) {
-               listener->nbconn--;
-               if (listener->state == LI_FULL &&
-                   listener->nbconn < listener->maxconn) {
+       if (s->listener) {
+               s->listener->nbconn--;
+               if (s->listener->state == LI_FULL &&
+                   s->listener->nbconn < s->listener->maxconn) {
                        /* we should reactivate the listener */
-                       EV_FD_SET(listener->fd, DIR_RD);
-                       listener->state = LI_READY;
+                       EV_FD_SET(s->listener->fd, DIR_RD);
+                       s->listener->state = LI_READY;
                }
        }