Hi,
Please help by checking the scenario and code snippet provided along with gdb logs.
Let us know if anything missing in cleanup of memory and reason for failures.
I am verifying below scenario,
-
application fxs files are loaded into confd after application connects to confd daemon
-
As fxs files are not present in confd when application tries to connect to confd, cdb_subscribe2() API is failing.
-
Application should retry by being in a while loop until respective fxs are loaded and confd restarts.
Observed errors:
Application crashes 2 times and 3rd time it is struct in confd_load_schemas() API call
1st crash : *** Error in ./eb': free(): invalid pointer: 0x00002b46ce934000 *** 2nd crash : *** Error in
./eb’: malloc(): memory corruption: 0x00002b4fb59f9010 ***
Below is the trace of application when it is struck in confd_load_schemas() API call
(gdb) bt
#0 __lll_lock_wait_private () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
#1 0x000000333ac7e14a in _L_lock_10423 () at malloc.c:5147
#2 0x000000333ac7b985 in __GI___libc_malloc (bytes=56) at malloc.c:2852
#3 0x000000333a40c74e in _dl_map_object_deps (map=map@entry=0x2b4fc0fb9ab8, preloads=preloads@entry=0x0, npreloads=npreloads@entry=0,
trace_mode=trace_mode@entry=0, open_mode=open_mode@entry=-2147483648) at dl-deps.c:511
#4 0x000000333a41292e in dl_open_worker (a=a@entry=0x2b4fc577bd08) at dl-open.c:261
#5 0x000000333a40e6d4 in _dl_catch_error (objname=objname@entry=0x2b4fc577bcf8, errstring=errstring@entry=0x2b4fc577bd00,
mallocedp=mallocedp@entry=0x2b4fc577bcf7, operate=operate@entry=0x333a412820 <dl_open_worker>, args=args@entry=0x2b4fc577bd08)
at dl-error.c:177
#6 0x000000333a4122eb in _dl_open (file=0x333ad61a46 "libgcc_s.so.1", mode=-2147483647, caller_dlopen=<optimized out>, nsid=-2, argc=2,
argv=0x7fffd1098ff8, env=0x284a4c0) at dl-open.c:650
#7 0x000000333ad1be72 in do_dlopen (ptr=<optimized out>) at dl-libc.c:87
#8 0x000000333a40e6d4 in _dl_catch_error (objname=0x2b4fc577bf00, errstring=0x2b4fc577bf08, mallocedp=0x2b4fc577beff,
operate=0x333ad1be30 <do_dlopen>, args=0x2b4fc577bf20) at dl-error.c:177
#9 0x000000333ad1bf0f in dlerror_run (operate=<optimized out>, args=<optimized out>) at dl-libc.c:46
#10 0x000000333ad1bf81 in __GI___libc_dlopen_mode (name=<optimized out>, mode=<optimized out>) at dl-libc.c:163
#11 0x000000333acf5a75 in init () at ../sysdeps/x86_64/backtrace.c:52
#12 0x00002b4fbcfc19a3 in pthread_once () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S:103
#13 0x000000333acf5b8c in __GI___backtrace (array=<optimized out>, size=<optimized out>) at ../sysdeps/x86_64/backtrace.c:103
#14 0x000000333ac1fe0b in backtrace_and_maps (do_abort=989484576, do_abort@entry=2, written=128, fd=2)
at ../sysdeps/unix/sysv/linux/libc_fatal.c:49
#15 0x000000333ac6e53f in __libc_message (do_abort=<optimized out>, fmt=<optimized out>) at ../sysdeps/posix/libc_fatal.c:172
#16 0x000000333ac7830e in malloc_printerr (action=<optimized out>, str=<optimized out>, ptr=<optimized out>) at malloc.c:4920
#17 0x000000333ac79e19 in _int_malloc (av=<optimized out>, bytes=<optimized out>) at malloc.c:3395
#18 0x000000333ac7b990 in __GI___libc_malloc (bytes=13845) at malloc.c:2855
#19 0x0000000000479665 in confd_malloc ()
#20 0x000000000047bb04 in term_read ()
#21 0x00000000004a7c49 in term_read_list ()
#22 0x00000000004ab2f7 in load_many_ns ()
#23 0x00000000004abe97 in maapi_load_schemas ()
#24 0x000000000047e9fe in confd_load_schemas ()
#25 0x000000000046dd64 in eb_confd_init () at confd_thread.c:1848
Below is the code snippet:
int eb_confd_init(void)
{
enum confd_debug_level dbg_lvl = CONFD_SILENT; // CONFD_TRACE, CONFD_DEBUG
struct confd_action_cbs eb_acb;
struct confd_trans_cbs eb_trans;
confd_init(EB_CONFD_APP, log_f_ptr, dbg_lvl);
if( CONFD_OK != (confd_load_schemas((struct sockaddr *)&eb_addr, sizeof(eb_addr))) ) {
return FAILURE_VAL;
}
if ((eb_dctx = confd_init_daemon(EB_CONFD_APP)) == NULL) {
return FAILURE_VAL;
}
if ((eb_ctlsock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
goto free_ctx;
}
if ( CONFD_OK != confd_connect(eb_dctx, eb_ctlsock, CONTROL_SOCKET,
(struct sockaddr*)&eb_addr,sizeof (struct sockaddr_in))){
goto free_ctlsock;
}
if ( (eb_workersock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
goto free_ctlsock;
}
if ( CONFD_OK != confd_connect(eb_dctx, eb_workersock, WORKER_SOCKET,
(struct sockaddr*)&eb_addr, sizeof (struct sockaddr_in)) ){
goto free_workersock;
}
memset(&eb_acb, 0, sizeof(eb_acb));
strcpy(eb_acb.actionpoint, EB_CONFD_AP);
eb_acb.init = init_action;
eb_acb.action = do_action;
eb_acb.abort = abort_action;
if ( CONFD_OK != confd_register_action_cbs(eb_dctx, &eb_acb) ){
goto free_workersock;
}
memset(&eb_trans, 0, sizeof (eb_trans));
eb_trans.init = init_trans;
if ( CONFD_OK != confd_register_trans_cb(eb_dctx, &eb_trans) ){
goto free_workersock;
}
if (confd_register_done(eb_dctx) != CONFD_OK){
goto free_workersock;
}
if ((eb_ss = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
goto free_workersock;
}
if( CONFD_OK != cdb_connect(eb_ss, CDB_SUBSCRIPTION_SOCKET,
(struct sockaddr *)&eb_addr, sizeof(eb_addr))){
goto free_sssock;
}
if( CONFD_OK != cdb_mandatory_subscriber(eb_ss, EB_CONFD_MS)){
goto free_sssock;
}
if( CONFD_OK != cdb_subscribe2(eb_ss, CDB_SUB_RUNNING_TWOPHASE, 0,
CONFD_PRIORITY_LEVEL2, &spoint1, 0, EB_CONFD_ROOT)){
goto free_sssock;
}
if( CONFD_OK != cdb_subscribe2(eb_ss, CDB_SUB_RUNNING_TWOPHASE, 0,
CONFD_PRIORITY_LEVEL1, &spoint2, 0, EB_CTX_ROOT)){
goto free_sssock;
}
if( CONFD_OK != cdb_subscribe_done(eb_ss)){
goto free_sssock;
}
if ( (eb_opersock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
goto free_sssock;
}
if( CONFD_OK != cdb_connect(eb_opersock, CDB_DATA_SOCKET,
(struct sockaddr *)&eb_addr, sizeof(eb_addr))){
goto free_opersock;
}
if ((eb_maapi_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
goto free_opersock;
}
if ( CONFD_OK != maapi_connect( eb_maapi_sock, (struct sockaddr*)&eb_addr,
sizeof (struct sockaddr_in))){
goto free_maapi_sock;
}
return 0;
free_maapi_sock:
close(eb_maapi_sock);
free_opersock:
close(eb_opersock);
free_sssock:
close(eb_ss);
free_workersock:
close(eb_workersock);
free_ctlsock:
close(eb_ctlsock);
free_ctx:
confd_release_daemon(eb_dctx);
return FAILURE_VAL ;
}
int main(){
while ( true ){
if ( eb_confd_init() < 0 ){
printf("Failed to initialize confd\n");
continue;
}
}
}