diff options
Diffstat (limited to 'infra/session_manager/session_manager.c')
| -rw-r--r-- | infra/session_manager/session_manager.c | 78 |
1 files changed, 47 insertions, 31 deletions
diff --git a/infra/session_manager/session_manager.c b/infra/session_manager/session_manager.c index 735bc4f..b4a7b17 100644 --- a/infra/session_manager/session_manager.c +++ b/infra/session_manager/session_manager.c @@ -5,6 +5,7 @@ #include "stellar/packet_manager.h" #include "stellar/session_manager.h" #include "stellar/module_manager.h" +#include "stellar/polling_manager.h" #include "utils.h" #include "session_internal.h" @@ -13,9 +14,6 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wunused-function" -#define SESSION_MANAGER_LOG_ERROR(format, ...) STELLAR_LOG_ERROR(__thread_local_logger, "session manager", format, ##__VA_ARGS__) -#define SESSION_MANAGER_LOG_INFO(format, ...) STELLAR_LOG_INFO(__thread_local_logger, "session manager", format, ##__VA_ARGS__) - struct session_manager_schema { struct exdata_schema *exdata; @@ -159,14 +157,8 @@ static void on_packet_output(enum packet_stage stage, struct packet *pkt, void * } } -static int on_polling(void *args) +static void clean_session(struct session_manager_runtime *sess_mgr_rt, uint64_t now_ms) { - struct session_manager *sess_mgr = (struct session_manager *)args; - struct stellar_module_manager *mod_mgr = sess_mgr->mod_mgr; - int thread_id = stellar_module_manager_get_thread_id(mod_mgr); - struct session_manager_runtime *sess_mgr_rt = sess_mgr->runtime[thread_id]; - uint64_t now_ms = clock_get_real_time_ms(); - #define MAX_CLEANED_SESS 1024 struct session *sess = NULL; struct session *cleaned_sess[MAX_CLEANED_SESS] = {NULL}; @@ -180,19 +172,21 @@ static int on_polling(void *args) exdata_runtime_free(exdata_rt); session_manager_runtime_free_session(sess_mgr_rt, sess); } +} + +static void on_polling(struct stellar_polling_manager *poll_mgr, void *args) +{ + struct session_manager *sess_mgr = (struct session_manager *)args; + struct stellar_module_manager *mod_mgr = sess_mgr->mod_mgr; + int thread_id = stellar_module_manager_get_thread_id(mod_mgr); + struct session_manager_runtime *sess_mgr_rt = sess_mgr->runtime[thread_id]; + uint64_t now_ms = clock_get_real_time_ms(); + + clean_session(sess_mgr_rt, now_ms); // TODO // ouput stat to fs4 - session_manager_runtime_print_stat(sess_mgr_rt); - - if (used == MAX_CLEANED_SESS) - { - return 1; - } - else - { - return 0; - } + // session_manager_runtime_print_stat(sess_mgr_rt); } /****************************************************************************** @@ -292,10 +286,25 @@ error_out: void session_manager_free(struct session_manager *sess_mgr) { + struct session_manager_stat *stat = NULL; + struct session_manager_runtime *sess_mgr_rt = NULL; + if (sess_mgr) { for (int i = 0; i < sess_mgr->thread_num; i++) { + sess_mgr_rt = sess_mgr->runtime[i]; + if (sess_mgr_rt == NULL) + { + continue; + } + + stat = session_manager_runtime_get_stat(sess_mgr_rt); + while (stat->tcp_sess_used || stat->udp_sess_used) + { + clean_session(sess_mgr_rt, UINT64_MAX); + } + session_manager_runtime_free(sess_mgr->runtime[i]); } @@ -305,7 +314,7 @@ void session_manager_free(struct session_manager *sess_mgr) } } -struct session_manager *session_manager_new(struct packet_manager *pkt_mgr, struct mq_schema *mq_schema, const char *toml_file) +struct session_manager *session_manager_new(struct stellar_polling_manager *poll_mgr, struct packet_manager *pkt_mgr, struct mq_schema *mq_schema, const char *toml_file) { assert(pkt_mgr); assert(mq_schema); @@ -319,7 +328,7 @@ struct session_manager *session_manager_new(struct packet_manager *pkt_mgr, stru { return NULL; } - if (load_and_validate_toml_integer_config(toml_file, "packet.nr_worker_thread", (uint64_t *)&thread_num, 0, MAX_THREAD_NUM)) + if (load_and_validate_toml_integer_config(toml_file, "packet_io.nr_worker_thread", (uint64_t *)&thread_num, 0, MAX_THREAD_NUM)) { return NULL; } @@ -357,6 +366,8 @@ struct session_manager *session_manager_new(struct packet_manager *pkt_mgr, stru } } + stellar_polling_subscribe(poll_mgr, on_polling, sess_mgr); + return sess_mgr; error_out: @@ -408,35 +419,40 @@ int session_manager_subscribe_tcp_stream(struct session_manager *sess_mgr, on_tc * session manager module ******************************************************************************/ -struct stellar_module *session_manager_module_on_init(struct stellar_module_manager *mod_mgr) +struct stellar_module *session_manager_on_init(struct stellar_module_manager *mod_mgr) { assert(mod_mgr); - - struct stellar_module *pkt_mgr_mod = stellar_module_manager_get_module(mod_mgr, "packet_manager_module"); + struct stellar_module *pkt_mgr_mod = stellar_module_manager_get_module(mod_mgr, PACKET_MANAGER_MODULE_NAME); + assert(pkt_mgr_mod); struct packet_manager *pkt_mgr = stellar_module_get_ctx(pkt_mgr_mod); + assert(pkt_mgr); + struct stellar_polling_manager *poll_mgr = stellar_module_get_polling_manager(mod_mgr); + assert(poll_mgr); struct mq_schema *mq_schema = stellar_module_manager_get_mq_schema(mod_mgr); + assert(mq_schema); const char *toml_file = stellar_module_manager_get_toml_path(mod_mgr); + assert(toml_file); - struct session_manager *sess_mgr = session_manager_new(pkt_mgr, mq_schema, toml_file); + struct session_manager *sess_mgr = session_manager_new(poll_mgr, pkt_mgr, mq_schema, toml_file); if (sess_mgr == NULL) { return NULL; } - struct stellar_module *sess_mgr_mod = stellar_module_new("session_manager_module", NULL); + struct stellar_module *sess_mgr_mod = stellar_module_new(SESSION_MANAGER_MODULE_NAME, NULL); if (sess_mgr_mod == NULL) { - SESSION_MANAGER_LOG_ERROR("failed to create session_manager_module"); + SESSION_MANAGER_LOG_ERROR("failed to create session_manager"); session_manager_free(sess_mgr); return NULL; } stellar_module_set_ctx(sess_mgr_mod, sess_mgr); - SESSION_MANAGER_LOG_INFO("session_manager_module initialized"); + SESSION_MANAGER_LOG_INFO("session_manager initialized"); return sess_mgr_mod; } -void session_manager_module_on_exit(struct stellar_module_manager *mod_mgr, struct stellar_module *mod) +void session_manager_on_exit(struct stellar_module_manager *mod_mgr __attribute__((unused)), struct stellar_module *mod) { if (mod) { @@ -444,6 +460,6 @@ void session_manager_module_on_exit(struct stellar_module_manager *mod_mgr, stru session_manager_free(sess_mgr); stellar_module_free(mod); - SESSION_MANAGER_LOG_ERROR("session_manager_module exited"); + SESSION_MANAGER_LOG_ERROR("session_manager exited"); } }
\ No newline at end of file |
