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

(ITS#3572) Producer hang when complex searchbase or filter defined in consumer RefreshAndPersist



Full_Name: Paolo Rossi
Version: 2.2.23
OS: solaris linux darwin
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (62.13.170.12)


Tested on openLDAP 2.2.20 and 2.2.23, BerckleyDB 4.2.52 and 4.3.27
OS: Solaris 8, Linux 2.4.x/2.6.x,  Darwin (OS X)

Scenario:

A simple producer and consumer configuration with consumer
type=refreshAndPersist.

Usually I've noticed searchbase set to simple root ("o=example,c=it") and filter
set to all (objectClass=*),
but if searchbase and/or filter have some complexity, eg:

searchbase="ou=people,o=example,c=it"  
   or
filter="(|(objectClass=organizationalUnit)(objectClass=inetOrgPerson))"

when consumer is running, producer hang at the first ldapadd operation (root
node yet created before).

In this condition, producer logs (debug 261) ends like:

oc_check_allowed type "cn"
oc_check_allowed type "subtreeSpecification"
oc_check_allowed type "contextCSN"
=> entry_encode(0x00000002): cn=ldapsync,o=h3g,c=it
=> bdb_search
bdb_dn2entry("ou=people,o=h3g,c=it")
search_candidates: base="ou=people,o=h3g,c=it" (0x00000004) scope=2
=> bdb_dn2idl( "ou=people,o=h3g,c=it" )
bdb_idl_fetch_key: @ou=people,o=h3g,c=it

note: =>bdb_search  appears only when ldapadd operation is performed with
consumer is running and configured with complex filter or searchbase.

also when hang, db_stat -Co report (if complex filter specified):

Locks grouped by object:
Locker   Mode      Count Status  ----------------- Object ---------------
80000013 WRITE         8 HELD    objectClass.bdb           page          1
       9 READ          1 WAIT    objectClass.bdb           page          1

       8 READ          1 HELD    objectClass.bdb           handle        0

if searchbase specified, WAIT is on dn2id.bdb

Now only kill -9 works on producer.
 

in back-bdb/add.c line 433:

			LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
				rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_ADD );
				if ( rc ) {
					Debug( LDAP_DEBUG_TRACE,
						LDAP_XSTRING(bdb_add)
						": persistent search failed "
						"(%d,%d)\n",
						rc, rs->sr_err, 0 );
				}
			}			


is executed only when consumer has those searchbase or filter set (and an add
operation on producer) then a search is performed and producer hang on :

back-bdb/idl.c line 519

rc = cursor->c_get( cursor, key, &data, flags | DB_SET );


I've tried to comment that "foreach" in add.c and the problem was disappear.

Maybe a bug?
Any suggestion?

Regards.