]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: connection: remove useless flag CO_FL_DATA_RD_SH
authorWilly Tarreau <w@1wt.eu>
Wed, 30 Aug 2017 05:35:35 +0000 (07:35 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 30 Aug 2017 06:18:50 +0000 (08:18 +0200)
This flag is both confusing and wrong. It is supposed to report the
fact that the data layer has received a shutdown, but in fact this is
reported by CO_FL_SOCK_RD_SH which is set by the transport layer after
this condition is detected. The only case where the flag above is set
is in the stream interface where CF_SHUTR is also set on the receiving
channel.

In addition, it was checked in the health checks code (while never set)
and was always test jointly with CO_FL_SOCK_RD_SH everywhere, except in
conn_data_read0_pending() which incorrectly doesn't match the second
time it's called and is fortunately protected by an extra check on
(ic->flags & CF_SHUTR).

This patch gets rid of the flag completely. Now conn_data_read0_pending()
accurately reports the fact that the transport layer has detected the end
of the stream, regardless of the fact that this state was already consumed,
and the stream interface watches ic->flags&CF_SHUTR to know if the channel
was already closed by the upper layer (which it already used to do).

The now unused conn_data_read0() function was removed.

contrib/debug/flags.c
include/proto/connection.h
include/types/connection.h
src/checks.c
src/stream_interface.c

index d45b9684f8ff806af1e9a9f73d2910c27d2ea56b..7b938a078d62f5c02e4d71806aaa18953b2f1db3 100644 (file)
@@ -117,7 +117,6 @@ void show_conn_flags(unsigned int f)
        SHOW_FLAG(f, CO_FL_SOCK_WR_SH);
        SHOW_FLAG(f, CO_FL_SOCK_RD_SH);
        SHOW_FLAG(f, CO_FL_DATA_WR_SH);
-       SHOW_FLAG(f, CO_FL_DATA_RD_SH);
        SHOW_FLAG(f, CO_FL_ADDR_TO_SET);
        SHOW_FLAG(f, CO_FL_ADDR_FROM_SET);
        SHOW_FLAG(f, CO_FL_WAIT_ROOM);
index db712f58bf281dd6b3e853e765c2ea93670a85f5..3a31fa385d5e2f71709e9696856fea1ad3c0bc2c 100644 (file)
@@ -428,12 +428,6 @@ static inline void conn_sock_read0(struct connection *c)
                fdtab[c->handle.fd].linger_risk = 0;
 }
 
-static inline void conn_data_read0(struct connection *c)
-{
-       c->flags |= CO_FL_DATA_RD_SH;
-       __conn_data_stop_recv(c);
-}
-
 static inline void conn_sock_shutw(struct connection *c)
 {
        c->flags |= CO_FL_SOCK_WR_SH;
@@ -465,7 +459,7 @@ static inline void conn_data_shutw_hard(struct connection *c)
 /* detect sock->data read0 transition */
 static inline int conn_data_read0_pending(struct connection *c)
 {
-       return (c->flags & (CO_FL_DATA_RD_SH | CO_FL_SOCK_RD_SH)) == CO_FL_SOCK_RD_SH;
+       return (c->flags & CO_FL_SOCK_RD_SH) != 0;
 }
 
 /* detect data->sock shutw transition */
index ce43b734ed75db1bcf6cefe8439ea7cf33671838..a24b8585c4ce159bc8142119445e5de90c7e5b05 100644 (file)
@@ -99,7 +99,7 @@ enum {
        /* unused : 0x00008000 */
 
        /* flags used to remember what shutdown have been performed/reported */
-       CO_FL_DATA_RD_SH    = 0x00010000,  /* DATA layer was notified about shutr/read0 */
+       /* unused : 0x00010000 */
        CO_FL_DATA_WR_SH    = 0x00020000,  /* DATA layer asked for shutw */
        CO_FL_SOCK_RD_SH    = 0x00040000,  /* SOCK layer was notified about shutr/read0 */
        CO_FL_SOCK_WR_SH    = 0x00080000,  /* SOCK layer asked for shutw */
index ca18220dca6c26656882b83ab785f552f75e4c74..db805e8f9a91b573973812a6f992a7b92202e688 100644 (file)
@@ -833,7 +833,7 @@ static void event_srv_chk_r(struct connection *conn)
        done = 0;
 
        conn->xprt->rcv_buf(conn, check->bi, check->bi->size);
-       if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_DATA_RD_SH)) {
+       if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH)) {
                done = 1;
                if ((conn->flags & CO_FL_ERROR) && !check->bi->i) {
                        /* Report network errors only if we got no other data. Otherwise
@@ -2793,7 +2793,7 @@ static void tcpcheck_main(struct connection *conn)
                                goto out_end_tcpcheck;
 
                        if (conn->xprt->rcv_buf(conn, check->bi, check->bi->size) <= 0) {
-                               if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_DATA_RD_SH)) {
+                               if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH)) {
                                        done = 1;
                                        if ((conn->flags & CO_FL_ERROR) && !check->bi->i) {
                                                /* Report network errors only if we got no other data. Otherwise
index a57828389eecd39224e3d6dd0fccb1b80a20a76e..c19c1469560531c94393cee0bf264ed66d149114 100644 (file)
@@ -1060,14 +1060,14 @@ static void si_conn_recv_cb(struct connection *conn)
        if (conn->flags & CO_FL_ERROR)
                return;
 
-       /* stop here if we reached the end of data */
-       if (conn_data_read0_pending(conn))
-               goto out_shutdown_r;
-
        /* maybe we were called immediately after an asynchronous shutr */
        if (ic->flags & CF_SHUTR)
                return;
 
+       /* stop here if we reached the end of data */
+       if (conn_data_read0_pending(conn))
+               goto out_shutdown_r;
+
        cur_read = 0;
 
        if ((ic->flags & (CF_STREAMER | CF_STREAMER_FAST)) && !ic->buf->o &&
@@ -1153,7 +1153,7 @@ static void si_conn_recv_cb(struct connection *conn)
         * that if such an event is not handled above in splice, it will be handled here by
         * recv().
         */
-       while (!(conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_DATA_RD_SH | CO_FL_WAIT_ROOM | CO_FL_HANDSHAKE))) {
+       while (!(conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_WAIT_ROOM | CO_FL_HANDSHAKE)) && !(ic->flags & CF_SHUTR)) {
                max = channel_recv_max(ic);
 
                if (!max) {
@@ -1267,7 +1267,6 @@ static void si_conn_recv_cb(struct connection *conn)
        if (ic->flags & CF_AUTO_CLOSE)
                channel_shutw_now(ic);
        stream_sock_read0(si);
-       conn_data_read0(conn);
        return;
 }