]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: dns: Use the sedesc to report and detect end of processing
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 31 Mar 2023 08:48:03 +0000 (10:48 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 5 Apr 2023 06:57:05 +0000 (08:57 +0200)
It is now the dns turn to be refactored to use the SE descriptor instead of
the channel to report error and end-of-stream. We must just be sure to
consume request data when we are waiting the applet to be released.

src/dns.c

index f16d681861e753b29ca546d54586321be1b0dde7..a0fdcadfe0cdce0bf2cd71c871377798aa4ba926 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -444,6 +444,11 @@ static void dns_session_io_handler(struct appctx *appctx)
        size_t len, cnt, ofs;
        int ret = 0;
 
+       if (unlikely(se_fl_test(appctx->sedesc, (SE_FL_EOS|SE_FL_ERROR|SE_FL_SHR|SE_FL_SHW)))) {
+               co_skip(sc_oc(sc), co_data(sc_oc(sc)));
+               goto out;
+       }
+
        /* if stopping was requested, close immediately */
        if (unlikely(stopping))
                goto close;
@@ -456,14 +461,6 @@ static void dns_session_io_handler(struct appctx *appctx)
        if (ds->shutdown)
                goto close;
 
-       if (unlikely(sc_ic(sc)->flags & CF_SHUTW))
-               goto close;
-
-       /* con closed by server side, we will skip data write and drain data from channel */
-       if ((sc_oc(sc)->flags & CF_SHUTW)) {
-               goto read;
-       }
-
        /* if the connection is not established, inform the stream that we want
         * to be notified whenever the connection completes.
         */
@@ -471,7 +468,7 @@ static void dns_session_io_handler(struct appctx *appctx)
                applet_need_more_data(appctx);
                se_need_remote_conn(appctx->sedesc);
                applet_have_more_data(appctx);
-               return;
+               goto out;
        }
 
        HA_RWLOCK_WRLOCK(DNS_LOCK, &ring->lock);
@@ -644,14 +641,11 @@ static void dns_session_io_handler(struct appctx *appctx)
                applet_have_no_more_data(appctx);
        }
 
-read:
-
        /* if session is not a waiter it means there is no committed
         * message into rx_buf and we are free to use it
         * Note: we need a load barrier here to not miss the
         * delete from the list
         */
-
        __ha_barrier_load();
        if (!LIST_INLIST_ATOMIC(&ds->waiter)) {
                while (1) {
@@ -664,7 +658,7 @@ read:
                                ret = co_getblk(sc_oc(sc), (char *)&msg_len, 2, 0);
                                if (ret <= 0) {
                                        if (ret == -1)
-                                               goto close;
+                                               goto error;
                                        applet_need_more_data(appctx);
                                        break;
                                }
@@ -685,7 +679,7 @@ read:
                                ret = co_getblk(sc_oc(sc), ds->rx_msg.area + ds->rx_msg.offset, co_data(sc_oc(sc)), 0);
                                if (ret <= 0) {
                                        if (ret == -1)
-                                               goto close;
+                                               goto error;
                                        applet_need_more_data(appctx);
                                        break;
                                }
@@ -707,7 +701,7 @@ read:
                        ret = co_getblk(sc_oc(sc), ds->rx_msg.area + ds->rx_msg.offset, ds->rx_msg.len - ds->rx_msg.offset, 0);
                        if (ret <= 0) {
                                if (ret == -1)
-                                       goto close;
+                                       goto error;
                                applet_need_more_data(appctx);
                                break;
                        }
@@ -756,20 +750,18 @@ read:
 
                        break;
                }
-
-               if (!LIST_INLIST(&ds->waiter)) {
-                       /* there is no more pending data to read and the con was closed by the server side */
-                       if (!co_data(sc_oc(sc)) && (sc_oc(sc)->flags & CF_SHUTW)) {
-                               goto close;
-                       }
-               }
-
        }
 
+out:
        return;
+
 close:
-       sc_shutw(sc);
-       sc_shutr(sc);
+       se_fl_set(appctx->sedesc, SE_FL_EOS|SE_FL_EOI);
+       goto out;
+
+error:
+       se_fl_set(appctx->sedesc, SE_FL_ERROR);
+       goto out;
 }
 
 void dns_queries_flush(struct dns_session *ds)