bapi: add options to have vpp cleanup client registration 42/16342/3
authorFlorin Coras <fcoras@cisco.com>
Wed, 5 Dec 2018 00:34:05 +0000 (16:34 -0800)
committerDave Barach <openvpp@barachs.net>
Wed, 5 Dec 2018 15:38:51 +0000 (15:38 +0000)
A client can send a memclnt delete message and ask vpp to cleanup the
shared memory queue. Obviously, in this case no delete reply is sent
back to the client.

Change-Id: I9c8375093f8607680ad498a6bed0690ba02a7c3b
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vcl/vppcom.c
src/vlibmemory/memclnt.api
src/vlibmemory/memory_api.c
src/vlibmemory/memory_client.c
src/vlibmemory/memory_client.h

index dbb0d65..0eaab6c 100644 (file)
@@ -737,14 +737,17 @@ vcl_intercept_sigchld_handler (int signum, siginfo_t * si, void *uc)
     return;
 
   child_wrk = vcl_worker_get_if_valid (wrk->forked_child);
-  if (si->si_pid != child_wrk->current_pid)
+  if (!child_wrk)
+    goto done;
+
+  if (si && si->si_pid != child_wrk->current_pid)
     {
       VDBG (0, "unexpected child pid %u", si->si_pid);
-      return;
+      goto done;
     }
-  if (child_wrk)
-    vcl_cleanup_forked_child (wrk, child_wrk);
+  vcl_cleanup_forked_child (wrk, child_wrk);
 
+done:
   if (old_sa.sa_flags & SA_SIGINFO)
     {
       void (*fn) (int, siginfo_t *, void *) = old_sa.sa_sigaction;
@@ -848,7 +851,7 @@ vppcom_app_exit (void)
   if (vec_len (vcm->workers) == 1)
     vl_client_disconnect_from_vlib ();
   else
-    vl_client_send_disconnect ();
+    vl_client_send_disconnect (1 /* vpp should cleanup */ );
 }
 
 /*
index 451bc0e..4802732 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-option version = "2.0.0";
+option version = "2.1.0";
 
 /*
  * Define services not following the normal conventions here
@@ -53,6 +53,7 @@ manual_print
 define memclnt_delete {
     u32 index;                  /* index, used e.g. by API trace replay */
     u64 handle;               /* handle by which vlib knows this client */
+    u8 do_cleanup;                             /* vlib to cleanup the registration */
 };
 
 define memclnt_delete_reply {
index 544e59d..cb15f0c 100644 (file)
@@ -296,23 +296,27 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp)
       svm = am->vlib_rp;
       int private_registration = 0;
 
-      /*
-       * Note: the API message handling path will set am->vlib_rp
-       * as appropriate for pairwise / private memory segments
-       */
-      rp = vl_msg_api_alloc (sizeof (*rp));
-      rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE_REPLY);
-      rp->handle = mp->handle;
-      rp->response = 1;
-
-      vl_msg_api_send_shmem (regp->vl_input_queue, (u8 *) & rp);
-
-      if (client_index != regp->vl_api_registration_pool_index)
+      /* Send reply unless client asked us to do the cleanup */
+      if (!mp->do_cleanup)
        {
-         clib_warning ("mismatch client_index %d pool_index %d",
-                       client_index, regp->vl_api_registration_pool_index);
-         vl_msg_api_free (rp);
-         return;
+         /*
+          * Note: the API message handling path will set am->vlib_rp
+          * as appropriate for pairwise / private memory segments
+          */
+         rp = vl_msg_api_alloc (sizeof (*rp));
+         rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE_REPLY);
+         rp->handle = mp->handle;
+         rp->response = 1;
+
+         vl_msg_api_send_shmem (regp->vl_input_queue, (u8 *) & rp);
+         if (client_index != regp->vl_api_registration_pool_index)
+           {
+             clib_warning ("mismatch client_index %d pool_index %d",
+                           client_index,
+                           regp->vl_api_registration_pool_index);
+             vl_msg_api_free (rp);
+             return;
+           }
        }
 
       /* For horizontal scaling, add a hash table... */
@@ -352,6 +356,8 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp)
                          regp->vl_api_registration_pool_index);
          pthread_mutex_lock (&svm->mutex);
          oldheap = svm_push_data_heap (svm);
+         if (mp->do_cleanup)
+           svm_queue_free (regp->vl_input_queue);
          vec_free (regp->name);
          /* Poison the old registration */
          clib_memset (regp, 0xF1, sizeof (*regp));
index 79344a6..3add39a 100644 (file)
@@ -271,7 +271,7 @@ vl_api_memclnt_delete_reply_t_handler (vl_api_memclnt_delete_reply_t * mp)
 }
 
 void
-vl_client_send_disconnect (void)
+vl_client_send_disconnect (u8 do_cleanup)
 {
   vl_api_memclnt_delete_t *mp;
   vl_shmem_hdr_t *shmem_hdr;
@@ -286,6 +286,7 @@ vl_client_send_disconnect (void)
   mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE);
   mp->index = am->my_client_index;
   mp->handle = (uword) am->my_registration;
+  mp->do_cleanup = do_cleanup;
 
   vl_msg_api_send_shmem (shmem_hdr->vl_input_queue, (u8 *) & mp);
 }
@@ -299,7 +300,7 @@ vl_client_disconnect (void)
   time_t begin;
 
   vl_input_queue = am->vl_input_queue;
-  vl_client_send_disconnect ();
+  vl_client_send_disconnect (0 /* wait for reply */ );
 
   /*
    * Have to be careful here, in case the client is disconnecting
index eb3431a..6aaf6d7 100644 (file)
@@ -21,7 +21,7 @@
 #include <vlibmemory/memory_shared.h>
 
 int vl_client_connect (const char *name, int ctx_quota, int input_queue_size);
-void vl_client_send_disconnect (void);
+void vl_client_send_disconnect (u8 do_cleanup);
 int vl_client_disconnect (void);
 int vl_client_api_map (const char *region_name);
 void vl_client_api_unmap (void);