diff options
| author | lijia <[email protected]> | 2021-12-17 16:24:56 +0800 |
|---|---|---|
| committer | lijia <[email protected]> | 2021-12-17 16:24:56 +0800 |
| commit | 9f8b439f27cf3d1055dda794914c2f28780f8ce4 (patch) | |
| tree | 6f47abbea45a773eedbf5a38461fbd79dccae247 /src/sapp_dev | |
| parent | 153e1673bc596fb545258db224ec9e84a1c8e455 (diff) | |
TSG-5517, sapp收到SIGTERM信号后,优雅退出.
Diffstat (limited to 'src/sapp_dev')
| -rw-r--r-- | src/sapp_dev/sapp_plug.c | 87 |
1 files changed, 66 insertions, 21 deletions
diff --git a/src/sapp_dev/sapp_plug.c b/src/sapp_dev/sapp_plug.c index cedac25..c66dabc 100644 --- a/src/sapp_dev/sapp_plug.c +++ b/src/sapp_dev/sapp_plug.c @@ -36,32 +36,23 @@ volatile unsigned long g_sapp_destory_env_done_state; static volatile unsigned long g_destory_env_per_thread_running_state[MAX_THREAD_NUM]; -static void signal_user_handler(int signo) -{ - //time_t last_time = time(NULL); - //while(time(NULL) < last_time + 10); /* wait 10 second, for DPDK IO module detect this process is not running */ - signal(signo, SIG_DFL); - kill(getpid(), signo); -} - static void signal_hup_handler(int signo) { printf("SIGHUP recviced!\n"); MESA_handle_runtime_log_reconstruction(NULL); } + +static void signal_term_handler(int signo) +{ + printf("SIGTERM recviced!\n"); + sapp_global_val->individual_volatile->recv_signal_SIGTERM = 1; +} + static void signal_take_over(void) { - sapp_config_t *pconfig = &sapp_global_val->config; signal(SIGHUP, signal_hup_handler); - if (0 == sapp_global_single.signal_take_over_sw && 0 == pconfig->tools.signal_handler.signal) - { - return; - } - - signal(SIGUSR1, signal_user_handler); - signal(SIGUSR2, signal_user_handler); - //signal(pconfig->tools.signal_handler.signal, signal_handler); + signal(SIGTERM, signal_term_handler); } @@ -93,10 +84,66 @@ static void sapp_wait_for_required_thread_starting(void) } } +static unsigned long long sapp_calc_line_pps(void) +{ + int i; + unsigned long long cur_count, pps_count; + static unsigned long long history_count = 0; + + cur_count = 0; + for(i=0;i<g_packet_io_thread_num;i++){ + cur_count += sapp_global_val->mthread_volatile[i]->sys_stat.count[SAPP_STAT_RCV_IPV4]; + cur_count += sapp_global_val->mthread_volatile[i]->sys_stat.count[SAPP_STAT_RCV_IPV6]; + } + + history_count = cur_count; + sleep(2); + + cur_count = 0; + for(i=0;i<g_packet_io_thread_num;i++){ + cur_count += sapp_global_val->mthread_volatile[i]->sys_stat.count[SAPP_STAT_RCV_IPV4]; + cur_count += sapp_global_val->mthread_volatile[i]->sys_stat.count[SAPP_STAT_RCV_IPV6]; + } + + pps_count = cur_count - history_count; + + return pps_count; +} + +#include "stream_inc/gdev_keepalive.h" +static void sapp_graceful_exit(void) +{ + if(0 == sapp_global_val->individual_volatile->recv_signal_SIGTERM){ + return; + } + + if((DEPOLYMENT_MODE_INLINE == sapp_global_val->config.packet_io.depolyment_mode_bin) + && (OVERLAY_MODE_VXLAN == sapp_global_val->config.packet_io.packet_io_tunnel.overlay_mode_bin)){ + SAPP_TLV_T stop_keepalive_opt = {}; + stop_keepalive_opt.type = GDEV_KEEPALIVE_OPT_GLOBAL_SWITCH; + stop_keepalive_opt.length = sizeof(int); + stop_keepalive_opt.int_value = 0; + gdev_keepalive_set_opt(&stop_keepalive_opt); + sapp_runtime_log(RLOG_LV_FATAL, "recv SIGTERM, for inline and vxlan mode, stop keepalive and waiting for all packet have been processed!\n"); + + /* �ر��˱���, ���м�ʮ�������ʱ, inline�豸�Ż�������Ϊ���ܶ˲�������, + ������̽�������, �ܶ����ᶪ��, + һֱ���, ֱ��û�����ݰ�Ϊֹ. + */ + while(sapp_calc_line_pps() != 0); + } + + sapp_runtime_log(RLOG_LV_FATAL, "recv SIGTERM, graceful exit!\n"); + libsapp_destroy_env(); + _exit(0); +} + + static void *sapp_monitor_thread(void *args) { - while(sapp_get_current_state() == SAPP_STATE_PROCESSING){ - usleep(1000); + while(sapp_get_current_state() <= SAPP_STATE_PROCESSING){ + sapp_graceful_exit(); + usleep(10000); } libsapp_destroy_env(); @@ -183,8 +230,6 @@ static void wait_for_all_io_threads(void) pthread_join(sapp_global_val->individual_fixed.thread_obtain_id[tseq], NULL); } - pthread_join(sapp_global_val->individual_fixed.thread_timer_event_id, NULL); - sapp_timer_destroy(sapp_global_val->individual_fixed.sapp_standalone_timer); } |
