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

Re: memory leak when processing lots of non-trivial search queries



Fixed in HEAD and OPENLDAP_REL_ENG_2, thanks.
        Kurt

At 02:24 AM 6/19/2001, Thomas Koch wrote:

>Hi,
>
>we are currently testing OpenLDAP 2.0.11 under somewhat heavy
>load sending lots of search requests from clients. 
>Each search expr contains multiple terms and operators
>(typically 3 to 5). We also use multiple additional
>indexes (5-10) on the database, through the ldbm backend.
>
>It turns out that there seems to be a memory leak in slapd.
>Given my limited knowledge and understanding of the actual 
>slapd code I have tried to track this down with mpatrol,
>which indicates two leak areas, several similar major ones 
>in filterindex.c and a smaller one in filter.c.
>
>Enclosed are patches to ./servers/slapd/filter.c and 
>./servers/slapd/back-ldbm/filterindex.c that seem to fix the
>problem. While slapd would fill 1GB of main memory within a 
>few minutes before, it is now stable at a minor fraction of memory.
>
>Is there a chance to get this confirmed?
>
>BTW, thanks for all the excellent work. Particular 2.x has been
>a real step forward for us.
>
>Thomas
>
>
># start of patch
>
>install/openldap-2.0.11> diff -C 2 ./servers/slapd/filter.c{-2.0.11-dist,}
>*** ./servers/slapd/filter.c-2.0.11-dist        Wed Oct 11 04:43:58 2000
>--- ./servers/slapd/filter.c    Tue Jun 19 11:07:09 2001
>***************
>*** 562,565 ****
>--- 562,568 ----
>                        ber_bvfree( f->f_sub_final );
>                }
>+               if (f->f_sub != NULL) {
>+                 ch_free(f->f_sub);
>+               }
>                break;
>
>install/openldap-2.0.11> diff -C 2 ./servers/slapd/back-ldbm/filterindex.c{-2.0.11-dist,}
>*** ./servers/slapd/back-ldbm/filterindex.c-2.0.11-dist Tue Oct  3 22:24:27 2000
>--- ./servers/slapd/back-ldbm/filterindex.c     Tue Jun 19 11:06:59 2001
>***************
>*** 273,276 ****
>--- 273,279 ----
>                        idl_free( idl );
>                        idl = NULL;
>+                       if ( tmp != NULL ) {
>+                         idl_free( tmp );
>+                       }
>                        Debug( LDAP_DEBUG_TRACE,
>                                "<= equality_candidates key read failed (%d)\n",
>***************
>*** 404,407 ****
>--- 407,413 ----
>                        idl_free( idl );
>                        idl = NULL;
>+                       if ( tmp != NULL ) {
>+                         idl_free( tmp );
>+                       }
>                        Debug( LDAP_DEBUG_TRACE, "<= approx_candidates key read failed (%d)\n",
>                            rc, 0, 0 );
>***************
>*** 420,423 ****
>--- 426,430 ----
>                idl = idl_intersection( be, idl, tmp );
>                idl_free( save );
>+               idl_free( tmp );
> 
>                if( idl == NULL ) break;
>***************
>*** 568,571 ****
>--- 575,581 ----
>                        idl_free( idl );
>                        idl = NULL;
>+                       if ( tmp != NULL ) {
>+                         idl_free( tmp );
>+                       }
>                        Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates key read failed (%d)\n",
>                            rc, 0, 0 );
>***************
>*** 584,587 ****
>--- 594,598 ----
>                idl = idl_intersection( be, idl, tmp );
>                idl_free( save );
>+               idl_free( tmp );
> 
>                if( idl == NULL ) break; 
>
># end of patch