static int
http_server_add_segment_callback (u32 client_index, u64 segment_handle)
{
- clib_warning ("called...");
- return -1;
+ return 0;
}
static void
a->session_cb_vft = &http_server_session_cb_vft;
a->options = options;
a->options[APP_OPTIONS_SEGMENT_SIZE] = segment_size;
+ a->options[APP_OPTIONS_ADD_SEGMENT_SIZE] = segment_size;
a->options[APP_OPTIONS_RX_FIFO_SIZE] =
hsm->fifo_size ? hsm->fifo_size : 8 << 10;
a->options[APP_OPTIONS_TX_FIFO_SIZE] =
static int
proxy_add_segment_callback (u32 client_index, u64 segment_handle)
{
- clib_warning ("called...");
- return -1;
+ return 0;
}
static int
static int
http_static_server_add_segment_callback (u32 client_index, u64 segment_handle)
{
- clib_warning ("called...");
- return -1;
+ return 0;
}
static void
a->session_cb_vft = &http_static_server_session_cb_vft;
a->options = options;
a->options[APP_OPTIONS_SEGMENT_SIZE] = segment_size;
+ a->options[APP_OPTIONS_ADD_SEGMENT_SIZE] = segment_size;
a->options[APP_OPTIONS_RX_FIFO_SIZE] =
hsm->fifo_size ? hsm->fifo_size : 8 << 10;
a->options[APP_OPTIONS_TX_FIFO_SIZE] =
ccfg = &sep->ext_cfg->crypto;
app_wrk = app_worker_get (sep->app_wrk_index);
- /* We need to call this because we call app_worker_init_connected in
- * quic_accept_stream, which assumes the connect segment manager exists */
- app_worker_alloc_connects_segment_manager (app_wrk);
app = application_get (app_wrk->app_index);
QUIC_DBG (2, "Called quic_start_listen for app %d", app_wrk->app_index);
attach_args.name = format (0, "session_test_server");
attach_args.namespace_id = appns_id;
+ /* Allow server to allocate another segment for listens. Needed
+ * because by default we do not allow segment additions */
+ attach_args.options[APP_OPTIONS_ADD_SEGMENT_SIZE] = 32 << 20;
attach_args.options[APP_OPTIONS_NAMESPACE_SECRET] = placeholder_secret;
error = vnet_application_attach (&attach_args);
SESSION_TEST ((error == 0), "server app attached: %U", format_clib_error,
SESSION_TEST (prod_fd != -1, "mq producer eventd valid %u", prod_fd);
}
- sm = app_worker_get_or_alloc_connect_segment_manager (app_wrk);
+ sm = app_worker_get_connect_segment_manager (app_wrk);
segment_manager_alloc_session_fifos (sm, 0, &rx_fifo, &tx_fifo);
s.rx_fifo = rx_fifo;
s.tx_fifo = tx_fifo;
/*
* Setup app worker
*/
- app_wrk->first_segment_manager = segment_manager_index (sm);
+ app_wrk->connects_seg_manager = segment_manager_index (sm);
app_wrk->listeners_table = hash_create (0, sizeof (u64));
app_wrk->event_queue = segment_manager_event_queue (sm);
app_wrk->app_is_builtin = application_is_builtin (app);
app_wrk->api_client_index = a->api_client_index;
application_api_table_add (app->app_index, a->api_client_index);
- sm = segment_manager_get (app_wrk->first_segment_manager);
+ sm = segment_manager_get (app_wrk->connects_seg_manager);
fs = segment_manager_get_segment_w_lock (sm, 0);
a->segment = &fs->ssvm;
a->segment_handle = segment_manager_segment_handle (sm, fs);
a->app_evt_q = app_wrk->event_queue;
app_wrk->api_client_index = a->api_client_index;
- sm = segment_manager_get (app_wrk->first_segment_manager);
+ sm = segment_manager_get (app_wrk->connects_seg_manager);
fs = segment_manager_get_segment_w_lock (sm, 0);
if (application_is_proxy (app))
application_setup_proxy (app);
/* The segment manager pool is reallocated because a new listener
* is added. Re-grab segment manager to avoid dangling reference */
- sm = segment_manager_get (app_wrk->first_segment_manager);
+ sm = segment_manager_get (app_wrk->connects_seg_manager);
}
ASSERT (vec_len (fs->ssvm.name) <= 128);
/** Application listens for events on this svm queue */
svm_msg_q_t *event_queue;
- /** Segment manager used for outgoing connects issued by the app */
+ /**
+ * Segment manager used for outgoing connects issued by the app. By
+ * convention this is the first segment manager allocated by the worker
+ * so it's also the one that holds the first segment with the app's
+ * message queue in it.
+ */
u32 connects_seg_manager;
/** Lookup tables for listeners. Value is segment manager index */
uword *listeners_table;
- /**
- * First segment manager has in the the first segment the application's
- * event fifo. Depending on what the app does, it may be either used for
- * a listener or for connects.
- */
- u32 first_segment_manager;
- u8 first_segment_manager_in_use;
-
/** API index for the worker. Needed for multi-process apps */
u32 api_client_index;
segment_manager_t *app_worker_get_listen_segment_manager (app_worker_t *,
session_t *);
segment_manager_t *app_worker_get_connect_segment_manager (app_worker_t *);
-segment_manager_t
- * app_worker_get_or_alloc_connect_segment_manager (app_worker_t *);
-int app_worker_alloc_connects_segment_manager (app_worker_t * app);
int app_worker_add_segment_notify (app_worker_t * app_wrk,
u64 segment_handle);
int app_worker_del_segment_notify (app_worker_t * app_wrk,
app_wrk->app_index = app->app_index;
app_wrk->wrk_map_index = ~0;
app_wrk->connects_seg_manager = APP_INVALID_SEGMENT_MANAGER_INDEX;
- app_wrk->first_segment_manager = APP_INVALID_SEGMENT_MANAGER_INDEX;
clib_spinlock_init (&app_wrk->detached_seg_managers_lock);
APP_DBG ("New app %v worker %u", app->name, app_wrk->wrk_index);
return app_wrk;
vec_free (app_wrk->detached_seg_managers);
clib_spinlock_free (&app_wrk->detached_seg_managers_lock);
- /* If first segment manager is used by a listener that recently
- * stopped listening, mark it as detached */
- if (app_wrk->first_segment_manager != app_wrk->connects_seg_manager
- && (sm = segment_manager_get_if_valid (app_wrk->first_segment_manager))
- && !segment_manager_app_detached (sm))
- {
- sm->first_is_protected = 0;
- sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
- segment_manager_init_free (sm);
- }
-
if (CLIB_DEBUG)
clib_memset (app_wrk, 0xfe, sizeof (*app_wrk));
pool_put (app_workers, app_wrk);
static segment_manager_t *
app_worker_alloc_segment_manager (app_worker_t * app_wrk)
{
- segment_manager_t *sm = 0;
+ segment_manager_t *sm;
- /* If the first segment manager is not in use, don't allocate a new one */
- if (app_wrk->first_segment_manager != APP_INVALID_SEGMENT_MANAGER_INDEX
- && app_wrk->first_segment_manager_in_use == 0)
- {
- sm = segment_manager_get (app_wrk->first_segment_manager);
- app_wrk->first_segment_manager_in_use = 1;
- }
- else
- {
- sm = segment_manager_alloc ();
- }
+ sm = segment_manager_alloc ();
sm->app_wrk_index = app_wrk->wrk_index;
segment_manager_init (sm);
return sm;
/* Try to cleanup segment manager */
sm = segment_manager_get (*sm_indexp);
- if (sm && segment_manager_has_fifos (sm))
- {
- /* Delete sessions in CREATED state */
- vec_add1 (states, SESSION_STATE_CREATED);
- segment_manager_del_sessions_filter (sm, states);
- vec_free (states);
- }
- if (sm && app_wrk->first_segment_manager != *sm_indexp)
+ if (sm)
{
segment_manager_app_detach (sm);
if (!segment_manager_has_fifos (sm))
- segment_manager_free (sm);
+ {
+ /* Empty segment manager, cleanup it up */
+ segment_manager_free (sm);
+ }
else
{
+ /* Delete sessions in CREATED state */
+ vec_add1 (states, SESSION_STATE_CREATED);
+ segment_manager_del_sessions_filter (sm, states);
+ vec_free (states);
+
/* Track segment manager in case app detaches and all the
* outstanding sessions need to be closed */
app_worker_add_detached_sm (app_wrk, *sm_indexp);
s->rx_fifo = 0;
s->tx_fifo = 0;
- sm = app_worker_get_or_alloc_connect_segment_manager (app_wrk);
+ sm = app_worker_get_connect_segment_manager (app_wrk);
if (app_worker_alloc_session_fifos (sm, s))
return -1;
{
int rv;
- /* Make sure we have a segment manager for connects */
- if (app_worker_alloc_connects_segment_manager (app_wrk))
- return SESSION_E_ALLOC;
-
if ((rv = session_open (app_wrk->wrk_index, sep, api_context)))
return rv;
return app->cb_fns.fifo_tuning_callback (s, f, act, len);
}
-int
-app_worker_alloc_connects_segment_manager (app_worker_t * app_wrk)
-{
- segment_manager_t *sm;
-
- if (app_wrk->connects_seg_manager == APP_INVALID_SEGMENT_MANAGER_INDEX)
- {
- sm = app_worker_alloc_segment_manager (app_wrk);
- if (sm == 0)
- return -1;
- app_wrk->connects_seg_manager = segment_manager_index (sm);
- }
- return 0;
-}
-
segment_manager_t *
app_worker_get_connect_segment_manager (app_worker_t * app)
{
return segment_manager_get (app->connects_seg_manager);
}
-segment_manager_t *
-app_worker_get_or_alloc_connect_segment_manager (app_worker_t * app_wrk)
-{
- if (app_wrk->connects_seg_manager == (u32) ~ 0)
- app_worker_alloc_connects_segment_manager (app_wrk);
- return segment_manager_get (app_wrk->connects_seg_manager);
-}
-
segment_manager_t *
app_worker_get_listen_segment_manager (app_worker_t * app,
session_t * listener)
}
tls_ctx_half_open_reader_unlock ();
- app_worker_alloc_connects_segment_manager (app_wrk);
ctx->tls_ctx_engine = engine_type;
clib_memcpy_fast (&cargs->sep, sep, sizeof (session_endpoint_t));
vec_terminate_c_string (ctx->srv_hostname);
}
- app_worker_alloc_connects_segment_manager (app_wrk);
ctx->tls_ctx_engine = engine_type;
clib_memcpy_fast (&cargs->sep, sep, sizeof (session_endpoint_t));