[Date Prev][Date Next] [Chronological] [Thread] [Top]

RE: Performance issue related to implementation of slap_op_add



If this condition is indeed the case, all that is needed to make it the code
constant time is to save a pointer to the tail of the list. A double linked
list is only needed if you need to traverse a list forwards and backwards.

________________________________
Glen Coakley, Sr. Software Engineer
MQSoftware Inc., (763) 543-4845
"Tinkero ergo sum." -- Chuck Murcko


> -----Original Message-----
> From: Arnaud Sahuguet [mailto:sahuguet@gradient.cis.upenn.edu]
> Sent: Friday, June 22, 2001 1:23 PM
> To: openldap-devel@OpenLDAP.org
> Subject: Performance issue related to implementation of slap_op_add
> 
> 
> Hi,
> 
> First a quick intro.
> I am a PhD student from Univ. of Pennsylvania, working on databases. I
> am using openLDAP as a backend storage to query XML. Any XML document
> can be encoded in LDAP and a query against the document is translated
> into a series of LDAP queries. (There is a nice paper about this:
> http://db.cis.upenn.edu/FAQ/cache/49.html).
> 
> My problem is that read and write operations are not fast 
> enough. I have
> been looking at the source code and I think I have identified 
> a possible
> improvement. This was pointed out by the authors of the paper 
> mentioned
> above. They also mention other performance improvements.
> 
> My understanding is that client requests are handled by a 
> queue (FIFO),
> implemented in openldap-2.0.11/servers/slapd/operations.c .
> 
> Usually a queue offers constant time operations for pushing a new item
> into the queue and popping the head of the queue.
> 
> In the code (see below), pushing a new item to the queue is 
> not constant
> but linear. If the queue is big, this can make a big difference. This
> can be fixed by using a double-linked list and keeping a 
> pointer to the
> head and tail of the queue.
> 
> I have spent only a few hours browsing through the 2.x code, 
> and maybe I
> am missing something.
> 
> Regards,
> 
> Arnaud
> 
> <copy-of-the-code>
> int slap_op_add(
>     Operation           **olist,
>         Operation               *op
> )
> {
>         Operation       **tmp;
> 
>         for ( tmp = olist; *tmp != NULL; tmp = &(*tmp)->o_next )
>                 ;       /* NULL */
> 
>         *tmp = op;
> 
>         return 0;
> }                 
> </copy-of-the-code>
>