vcl: confirm reset on transport cleanup 65/28165/4
authorFlorin Coras <fcoras@cisco.com>
Tue, 4 Aug 2020 01:55:40 +0000 (18:55 -0700)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 20 Oct 2020 17:52:47 +0000 (17:52 +0000)
Type: fix

Change-Id: Ife579f305409bf987639634213008a7d7f35acd7
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vcl/vppcom.c

index dd50df1..947bf28 100644 (file)
@@ -784,9 +784,22 @@ vcl_session_cleanup_handler (vcl_worker_t * wrk, void *data)
       /* Transport was cleaned up before we confirmed close. Probably the
        * app is still waiting for some data that cannot be delivered.
        * Confirm close to make sure everything is cleaned up */
-      if (session->session_state == VCL_STATE_VPP_CLOSING)
-       vcl_session_cleanup (wrk, session, vcl_session_handle (session),
-                            1 /* do_disconnect */ );
+      if (session->session_state == VCL_STATE_VPP_CLOSING
+         || session->session_state == VCL_STATE_DISCONNECT)
+       {
+         vcl_session_cleanup (wrk, session, vcl_session_handle (session),
+                              1 /* do_disconnect */ );
+         /* Move to undetermined state to ensure that the session is not
+          * removed before both vpp and the app cleanup.
+          * - If the app closes first, the session is moved to CLOSED state
+          *   and the session cleanup notification from vpp removes the
+          *   session.
+          * - If vpp cleans up the session first, the session is moved to
+          *   DETACHED state lower and subsequently the close from the app
+          *   frees the session
+          */
+         session->session_state = VCL_STATE_UPDATED;
+       }
       return;
     }