hs-test: more debug output in http3 test
[vpp.git] / src / vcl / vcl_private.c
index b6ef815..4af79e9 100644 (file)
@@ -138,6 +138,9 @@ vcl_api_app_worker_add (void)
 void
 vcl_api_app_worker_del (vcl_worker_t * wrk)
 {
+  if (wrk->api_client_handle == ~0)
+    return;
+
   if (vcm->cfg.vpp_app_socket_api)
     return vcl_sapi_app_worker_del (wrk);
 
@@ -188,6 +191,8 @@ vcl_worker_detach_sessions (vcl_worker_t *wrk)
 {
   session_event_t *e;
   vcl_session_t *s;
+  uword *seg_indices_map = 0;
+  u32 seg_index, val, *seg_indices = 0;
 
   close (wrk->app_api_sock.fd);
   pool_foreach (s, wrk->sessions)
@@ -197,9 +202,13 @@ vcl_worker_detach_sessions (vcl_worker_t *wrk)
          s->session_state = VCL_STATE_LISTEN_NO_MQ;
          continue;
        }
-      if (s->flags & VCL_SESSION_F_IS_VEP)
+      if ((s->flags & VCL_SESSION_F_IS_VEP) ||
+         s->session_state == VCL_STATE_LISTEN_NO_MQ ||
+         s->session_state == VCL_STATE_CLOSED)
        continue;
 
+      hash_set (seg_indices_map, s->tx_fifo->segment_index, 1);
+
       s->session_state = VCL_STATE_DETACHED;
       vec_add2 (wrk->unhandled_evts_vector, e, 1);
       e->event_type = SESSION_CTRL_EVT_DISCONNECTED;
@@ -207,7 +216,16 @@ vcl_worker_detach_sessions (vcl_worker_t *wrk)
       e->postponed = 1;
     }
 
-  vcl_segment_detach_all ();
+  hash_foreach (seg_index, val, seg_indices_map,
+               ({ vec_add1 (seg_indices, seg_index); }));
+
+  vcl_segment_detach_segments (seg_indices);
+
+  /* Detach worker's mqs segment */
+  vcl_segment_detach (vcl_vpp_worker_segment_handle (wrk->wrk_index));
+
+  vec_free (seg_indices);
+  hash_free (seg_indices_map);
 }
 
 vcl_worker_t *
@@ -234,6 +252,7 @@ vcl_worker_alloc_and_init ()
 
   wrk = vcl_worker_alloc ();
   vcl_set_worker_index (wrk->wrk_index);
+  wrk->api_client_handle = ~0;
   wrk->thread_id = pthread_self ();
   wrk->current_pid = getpid ();
 
@@ -322,7 +341,8 @@ vcl_session_read_ready (vcl_session_t * s)
          if (ph.data_length + SESSION_CONN_HDR_LEN > max_deq)
            return 0;
 
-         return ph.data_length;
+         /* Allow zero legth datagrams */
+         return ph.data_length ? ph.data_length : 1;
        }
 
       return svm_fifo_max_dequeue_cons (s->rx_fifo);
@@ -416,6 +436,7 @@ vcl_segment_attach (u64 segment_handle, char *name, ssvm_segment_type_t type,
   if ((rv = fifo_segment_attach (&vcm->segment_main, a)))
     {
       clib_warning ("svm_fifo_segment_attach ('%s') failed", name);
+      clib_rwlock_writer_unlock (&vcm->segment_table_lock);
       return rv;
     }
   hash_set (vcm->segment_table, segment_handle, a->new_segment_indices[0]);
@@ -459,25 +480,37 @@ vcl_segment_detach (u64 segment_handle)
 
   clib_rwlock_writer_unlock (&vcm->segment_table_lock);
 
-  VDBG (0, "detached segment %u handle %u", segment_index, segment_handle);
+  VDBG (0, "detached segment %u handle %lx", segment_index, segment_handle);
 }
 
 void
-vcl_segment_detach_all ()
+vcl_segment_detach_segments (u32 *seg_indices)
 {
-  u64 *segs = 0, *seg, key;
+  u64 *seg_handles = 0, *seg_handle, key;
+  u32 *seg_index;
   u32 val;
 
   clib_rwlock_reader_lock (&vcm->segment_table_lock);
 
-  hash_foreach (key, val, vcm->segment_table, ({ vec_add1 (segs, key); }));
+  vec_foreach (seg_index, seg_indices)
+    {
+      /* clang-format off */
+      hash_foreach (key, val, vcm->segment_table, ({
+        if (val == *seg_index)
+          {
+            vec_add1 (seg_handles, key);
+            break;
+          }
+      }));
+      /* clang-format on */
+    }
 
   clib_rwlock_reader_unlock (&vcm->segment_table_lock);
 
-  vec_foreach (seg, segs)
-    vcl_segment_detach (seg[0]);
+  vec_foreach (seg_handle, seg_handles)
+    vcl_segment_detach (seg_handle[0]);
 
-  vec_free (segs);
+  vec_free (seg_handles);
 }
 
 int