]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: peers: make peer_session_forceshutdown() use the appctx and not the stream
authorWilly Tarreau <w@1wt.eu>
Mon, 31 Oct 2016 16:37:39 +0000 (17:37 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 31 Oct 2016 19:07:01 +0000 (20:07 +0100)
It was inherited from initial code but we must only manipulate the appctx
and never the stream, otherwise we always risk shooting ourselves in the
foot.

src/peers.c

index 9e14685f523836fb3a06fd295dea96f1222d8543..6b8f7f9ef38ced44f31b1cb0ef3c96b3caad6f54 100644 (file)
@@ -172,7 +172,7 @@ enum {
 #define PEER_DWNGRD_MINOR_VER 0
 
 struct peers *peers = NULL;
-static void peer_session_forceshutdown(struct stream * stream);
+static void peer_session_forceshutdown(struct appctx *appctx);
 
 int intencode(uint64_t i, char **str) {
        int idx = 0;
@@ -669,7 +669,7 @@ switchstate:
                                                appctx->st1 = PEER_SESS_SC_TRYAGAIN;
                                                goto switchstate;
                                        }
-                                       peer_session_forceshutdown(curpeer->stream);
+                                       peer_session_forceshutdown(curpeer->appctx);
                                }
                                if (maj_ver != (unsigned int)-1 && min_ver != (unsigned int)-1) {
                                        if (min_ver == PEER_DWNGRD_MINOR_VER) {
@@ -1708,25 +1708,16 @@ static struct applet peer_applet = {
 /*
  * Use this function to force a close of a peer session
  */
-static void peer_session_forceshutdown(struct stream * stream)
+static void peer_session_forceshutdown(struct appctx *appctx)
 {
-       struct appctx *appctx = NULL;
        struct peer *ps;
 
-       int i;
-
-       for (i = 0; i <= 1; i++) {
-               appctx = objt_appctx(stream->si[i].end);
-               if (!appctx)
-                       continue;
-               if (appctx->applet != &peer_applet)
-                       continue;
-               break;
-       }
-
        if (!appctx)
                return;
 
+       if (appctx->applet != &peer_applet)
+               return;
+
        ps = appctx->ctx.peers.ptr;
        /* we're killing a connection, we must apply a random delay before
         * retrying otherwise the other end will do the same and we can loop
@@ -1980,7 +1971,7 @@ static struct task *process_peer_sync(struct task * task)
                        /* disconnect all connected peers */
                        for (ps = peers->remote; ps; ps = ps->next) {
                                if (ps->stream) {
-                                       peer_session_forceshutdown(ps->stream);
+                                       peer_session_forceshutdown(ps->appctx);
                                        ps->stream = NULL;
                                        ps->appctx = NULL;
                                }