I have a little program using binary API to configure VPP (v21.06). It's
written in C. When VPP restarts, it needs to re-configure VPP. I noticed after
VPP restarts, all API calls have no reply. So I tried to disconnect, then
connect again. After first restart, everything works fine. But the second time
VPP restarts, my program cored. Here is the backtrace:
[Thread 0x7fffd8f05700 (LWP 18019) exited]
vl_client_disconnect:309: peer unresponsive, give up <===== First vpp
restarts
[New Thread 0x7fffd8f05700 (LWP 23599)]
[New Thread 0x7fffbbffe700 (LWP 23737)]
[Thread 0x7fffbbffe700 (LWP 23737) exited]
[Thread 0x7fffd8f05700 (LWP 23599) exited]
vl_client_disconnect:309: peer unresponsive, give up <=======Second
vpp restarts
Program received signal SIGABRT, Aborted.
[Switching to Thread 0x7fffea709700 (LWP 18016)]
0x00007ffff5ef2387 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install
fuse-libs-2.9.4-1.0.9.el7.x86_64 glibc-2.17-324.0.1.el7_9.x86_64
keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-50.0.1.el7.x86_64
libcom_err-1.42.9-19.el7.x86_64 libgcc-4.8.5-44.0.3.el7.x86_64
libselinux-2.5-15.el7.x86_64 libstdc++-4.8.5-44.0.3.el7.x86_64
numactl-libs-2.0.12-5.0.3.el7.x86_64 openssl-libs-1.0.2k-21.0.3_talari.x86_64
pcre-8.32-17.el7.x86_64 zlib-1.2.7-19.el7_9.x86_64
(gdb) bt
#0 0x00007ffff5ef2387 in raise () from /lib64/libc.so.6
#1 0x00007ffff5ef3a78 in abort () from /lib64/libc.so.6
#2 0x00007ffff7f80cb6 in os_panic () from
/home/talariuser/vpp_root/usr/lib/libvppinfra.so.21.06.0
#3 0x00007ffff7fd3c45 in mspace_free () from
/home/talariuser/vpp_root/usr/lib/libvppinfra.so.21.06.0
#4 0x00007ffff7f5dd79 in clib_mem_free (p=0x7fffd8f0de98) at
/usr/src/debug/vpp-21.06.0/src/vppinfra/mem.h:321
#5 vl_api_name_and_crc_free () at
/usr/src/debug/vpp-21.06.0/src/vlibmemory/memory_client.c:108
#6 0x00007ffff7f5e626 in vl_api_memclnt_create_reply_t_handler
(mp=0x13004d648) at
/usr/src/debug/vpp-21.06.0/src/vlibmemory/memory_client.c:135
#7 0x00007ffff7f65b5b in msg_handler_internal (free_it=1, do_it=1,
trace_it=<optimized out>, the_msg=0x13004d648, am=0x7ffff7f76560
<api_global_main>) at /usr/src/debug/vpp-21.06.0/src/vlibapi/api_shared.c:501
#8 vl_msg_api_handler (the_msg=0x13004d648) at
/usr/src/debug/vpp-21.06.0/src/vlibapi/api_shared.c:708
#9 0x00007ffff7f5ebc0 in vl_client_connect (name=name@entry=0x5bb157 "t3_app",
ctx_quota=ctx_quota@entry=0, input_queue_size=input_queue_size@entry=1024)
at /usr/src/debug/vpp-21.06.0/src/vlibmemory/memory_client.c:243
#10 0x00007ffff7f5ef95 in connect_to_vlib_internal (do_map=1,
thread_fn_arg=0x0, thread_fn=0x7ffff7f5e4f0 <rx_thread_fn>,
rx_queue_size=<optimized out>, client_name=0x5bb157 "t3_app",
svm_name=0x5c2d0b "/vpe-api") at
/usr/src/debug/vpp-21.06.0/src/vlibmemory/memory_client.c:417
#11 vl_client_connect_to_vlib (svm_name=svm_name@entry=0x5c2d0b "/vpe-api",
client_name=client_name@entry=0x5bb157 "t3_app",
rx_queue_size=rx_queue_size@entry=1024)
at /usr/src/debug/vpp-21.06.0/src/vlibmemory/memory_client.c:458
#12 0x00000000004ef9ce in vpp_api_init (vpp_restarts=vpp_restarts@entry=1
'\001') at control/vpp_api_agent.c:216
#13 0x00000000004daa47 in resend_routes_to_vpp () at control/routes_mgr.c:2275
#14 0x000000000041c5e7 in cli_process_command (msg=msg@entry=0x7fffea6c82f0) at
manage/cli.c:425
#15 0x000000000041a2e1 in msgq_handler_thread (dummy=<optimized out>) at
manage/console.c:4121
#16 0x00000000004b24b7 in thread_dispatcher (thread_args=0x17fd8c0
<t2_thread_list+832>) at common/thread_manager.c:530
#17 0x00007ffff7bc6ea5 in start_thread () from /lib64/libpthread.so.0
#18 0x00007ffff5fba9fd in clone () from /lib64/libc.so.6
(gdb)
Here is the related code:
typedef struct
{
svm_queue_t *vl_input_queue; /* vpe input queue */
u32 my_client_index; /* API client handle */
} vpp_api_agent_main_t;
vpp_api_agent_main_t agent_main;
void vpp_api_init(boolean vpp_restarts)
{
if (vpp_restarts)
{
vl_client_disconnect_from_vlib();
}
// Initialization
clib_mem_init_thread_safe(0, 256 << 20);
clib_memset(&agent_main, 0, sizeof (vpp_api_agent_main_t));
// Create shared mem with vpp
api_main_t *am = vlibapi_get_main();
if (vl_client_connect_to_vlib("/vpe-api", "t3_app", DEFAULT_QUEUE_SIZE) < 0)
{
ROUTE_LOG_ERROR("Shmem connect failed\n");
svm_region_exit();
}
else
{
agent_main.vl_input_queue = am->shmem_hdr->vl_input_queue;
agent_main.my_client_index = am->my_client_index;
ROUTE_LOG("Connected to vpp!!!\n");
}
// Register callback functions
agent_api_hookup(&agent_main);
}
Anybody know what do I need to cleanup before reconnect to vpp again? Thanks in
advance.
Wei
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#21010): https://lists.fd.io/g/vpp-dev/message/21010
Mute This Topic: https://lists.fd.io/mt/89737580/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-