diff options
Diffstat (limited to 'src/vcl/vppcom.c')
-rw-r--r-- | src/vcl/vppcom.c | 19 |
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; } |