[getdns-api] Segmentation fault under load

Willem Toorop willem at nlnetlabs.nl
Thu Sep 8 13:39:03 UTC 2016


Op 08-09-16 om 15:13 schreef Robert Groenenberg:
> Hi,
> 
> Running an application that sends out ENUM queries using getdns
> (v1.0.0b2) and libevent2 on CentOS 6, runs fine for a low amount of
> requests.
> However, when sending ~50 requests per second, a segmenation fault
> occurs in _getdns_rbtree_insert() (some runs the Segv occurs in the
> compare function), after a few minutes.
> 
>> Program terminated with signal 11, Segmentation fault.
>> #0  _getdns_rbtree_insert (rbtree=0x104a518, data=0x7f80f8004cc0) at
>> util/rbtree.c:240
>> 240            if ((r = rbtree->cmp(data->key, node->key)) == 0) {
> 
>> #0  _getdns_rbtree_insert (rbtree=0x104a518, data=0x7f80f8004cc0) at
>> util/rbtree.c:240
>> #1  0x00007f80cc1dc0ef in _getdns_context_track_outbound_request
>> (dnsreq=0x7f80f8004cc0)
>>     at ./context.c:3080
>> #2  0x00007f80cc1c9fed in getdns_general_ns (context=0x10493e0,
>> loop=0x1024940,
>>     name=<value optimized out>, request_type=35, extensions=<value
>> optimized out>,
>>     userarg=0x7f80f8006b50, return_netreq_p=0x7f809c5cbb88,
>>     callbackfn=0x7f80cc44f7d0 <enum_lclient_callback>, internal_cb=0,
>> usenamespaces=0)
>>     at ./general.c:452
>> #3  0x00007f80cc1ca3f1 in _getdns_general_loop (context=<value
>> optimized out>,
>>     loop=<value optimized out>, name=<value optimized out>,
>> request_type=<value optimized out>,
>>     extensions=<value optimized out>, userarg=<value optimized out>,
>> netreq_p=0x7f809c5cbb88,
>>     callback=0x7f80cc44f7d0 <enum_lclient_callback>, internal_cb=0) at
>> ./general.c:517
>> #4  0x00007f80cc1ca454 in getdns_general (context=<value optimized out>,
>>     name=<value optimized out>, request_type=<value optimized out>,
>>     extensions=<value optimized out>, userarg=<value optimized out>,
>>     transaction_id=0x7f80f8006b78, callbackfn=0x7f80cc44f7d0
>> <enum_lclient_callback>)
>>     at ./general.c:674
> 
> I suspect this to be a threading issue: the rbtree being accessed for
> both insert and delete from different threads. The call to
> /getdns_general//()/ is protected by a mutex in my application, so only
> one thread issues a query at a time. However, the event base runs in its
> own thread, as usual with libevent, so the problem probably lies in
> entries being deleted from the rbtree when the response is handled.
> 
> Is it supposed to be possible with getdns to run the event base in its
> own thread?

No getdns does not anticipate this modus operandi (as you found out
yourself already).  Running and scheduling should be done from the same
thread.


-- Willem

> 
> Thanks,
> Robert
> 
> 
> _______________________________________________
> spec mailing list
> spec at getdnsapi.net
> 




More information about the spec mailing list