summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vcl/vppcom.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index dd50df153bb..947bf287e2d 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -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;
}