[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
RE: back-bdb deadlocks
At the moment I'm testing without any special ACLs.
-- Howard Chu
Chief Architect, Symas Corp. Director, Highland Sun
http://www.symas.com http://highlandsun.com/hyc
Symas: Premier OpenSource Development and Support
> -----Original Message-----
> From: Kurt D. Zeilenga [mailto:Kurt@OpenLDAP.org]
> Sent: Wednesday, January 16, 2002 6:34 PM
> To: Howard Chu
> Cc: openldap-devel@OpenLDAP.org
> Subject: Re: back-bdb deadlocks
>
>
> I assume you aren't using ACLs which might access other entries?
>
> Looks like be_group() and be_attribute() are using the transaction
> id passed in via o_private....
>
> Kurt
>
> At 04:40 PM 2002-01-16, Howard Chu wrote:
> >I believe a similar solution to this is needed in back-bdb, but I haven't
> >yet spent much time thinking about it can work. The current
> situation is that
> >back-bdb gets deadlocked very easily by more than 2 simultaneous updaters.
> >There doesn't seem to be any easy solution to this; my debug
> session with three
> >deadlocked threads showed that two of them were deadlocked in
> txn_abort - i.e.,
> >deadlock detection already did it's job, but new locks were still needed to
> >unravel the transaction. Pretty rude. (I suspect this situation
> arose because I
> >was testing bdb_add where the parent entry was obtained outside of the
> >transaction. With the parent entry inside the transaction, the
> deadlock still
> >occurs, but doesn't get detected!)
> >
> >Someone needs to take a careful look at what records we touch and in what
> >order. My suspicion is that we cannot guarantee that we can keep
> transactions
> >out of each others' way. Considering that the deeper a tree gets, the more
> >objects get locked for a transaction, the number of locks being
> held gets huge.
> >I briefly experimented with nested transactions before, with no
> better success.
> >I guess this is because even after the nested transaction is
> committed, none of
> >its resources/locks are released until the parent transaction
> commits. Perhaps
> >I've gone the wrong direction; and maybe all operations (even
> read-only) need
> >to be wrapped in transactions just to keep locks consistent.
> >
> > -- Howard Chu
> > Chief Architect, Symas Corp. Director, Highland Sun
> > http://www.symas.com http://highlandsun.com/hyc
> > Symas: Premier OpenSource Development and Support
> >
> >-----Original Message-----
> >From: owner-openldap-bugs@OpenLDAP.org
> >[mailto:owner-openldap-bugs@OpenLDAP.org] On Behalf Of
> >adamson@andrew.cmu.edu
> >Sent: Thursday, October 11, 2001 8:04 AM
> >To: openldap-its@OpenLDAP.org
> >Subject: Re: index corruption (1164) still present in 2.0.15 with db
> >3.1.17 (ITS#1359)
> >
> >
> >> I think you've hit on the problem. This likely effects
> >> DN parent/subtree indices as well. We can either try to
> >> add some fine grained r/w locks or one giant r/w lock.
> >> I suggest the latter and that it initially be quite
> >> giant. That is, every "database" have one giant lock
> >> which is acquired for read for LDAP read operations and
> >> acquired for write for LDAP write operations. This
> >> will serialize all writes within a given "database".
> >
> >I have a program that splices a lot of threads and does a lot of
> >add & delete operations to several attributes in many entries. (My days at
> >Transarc IBM testing AFS are coming back to me) The idea is to have many
> >threads in the slapd server accessing the same keys in the same index
> >files at the same time. It does a pretty efficient job of causing and
> >detecting index corruption.
> >
> >I did some experimental work on locking by adding a mutex to each dbcache
> >structure in back-ldbm. It is only invoked in key_change() in key.c,
> >around the two calls to change an index item:
> >
> > ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
> > if (op == SLAP_INDEX_ADD_OP) {
> > /* Add values */
> > rc = idl_insert_key( be, db, key, id );
> >
> > } else {
> > /* Delete values */
> > rc = idl_delete_key( be, db, key, id );
> > }
> > ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
> >
> >If I placed the lock higher in the stack, such as in indexer(), it also
> >works, but that means the lock is in place while CPU intensive indexing
> >functions for matching rules are being called, which is inefficient.
> >The lock cannot be placed any lower in the stack, for greater granularity,
> >since idl_insert_key and idl_delete_key are the ones doing the
> >modifications. A greater level of granularity could be achieved by
> >locking on a dbcache-key basis, but this would require a lot more
> >complexity (lists of keys that are being modified).
> >
> >I initialize the mutex when the dbcache is being initialized (e.g. the
> >cache name is being copied in) in ldbm_cache_open() and I destroy the
> >mutex in ldbm_cache_destroy().
> >
> >
> >My particular test program is no longer able to corrupt the index files
> >with this "medium grain" locking.
> >
> >
> >-Mark Adamson
> > Carnegie Mellon
>