This is a multi-part message in MIME format. --------------040402080004020608060006 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit
On 09.04.2012 20:09, Hrvoje Habjanić wrote:
Hi.
Two more "hang"s, both in sched_yield(). This is with replacement malloc (tcmalloc, minimal).
http://free-zg.t-com.hr/HrvojeHabjanic/openldap/hang4.log http://free-zg.t-com.hr/HrvojeHabjanic/openldap/hang5.log
H.
Hi.
Attached patch if solving my proglem with "hang" in sched_yield.
In general, i do think that there (cache management) is a lot of unnecessary locking and waiting ... And simplifying things there would solve a lot of problems ... Probably. :-)
Of course, i'm not shure how will this change influence the rest of the code, but it does work for me (tm).
H.
p.s. Also available at http://free-zg.t-com.hr/HrvojeHabjanic/openldap/ol.diff
--------------040402080004020608060006 Content-Type: text/x-patch; name="ol.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ol.diff"
diff -Nru openldap-d7d1789-org/servers/slapd/back-bdb/cache.c openldap-d7d1789/servers/slapd/back-bdb/cache.c --- openldap-d7d1789-org/servers/slapd/back-bdb/cache.c 2012-04-10 00:47:23.000000000 +0200 +++ openldap-d7d1789/servers/slapd/back-bdb/cache.c 2012-04-11 10:23:43.267461183 +0200 @@ -1361,7 +1361,7 @@ DB_LOCK *lock ) { EntryInfo *ei = BEI(e); - int rc, busy = 0; + int rc, busy = 0, counter = 0;
assert( e->e_private != NULL );
@@ -1378,7 +1378,7 @@
bdb_cache_entryinfo_unlock( ei );
- while ( busy ) { + while ( busy && counter < 1000) { ldap_pvt_thread_yield(); busy = 0; bdb_cache_entryinfo_lock( ei ); @@ -1387,6 +1387,13 @@ ei->bei_finders > 0 ) busy = 1; bdb_cache_entryinfo_unlock( ei ); + counter ++; + } + if( busy ) { + bdb_cache_entryinfo_lock( ei ); + ei->bei_state ^= CACHE_ENTRY_DELETED; + bdb_cache_entryinfo_unlock( ei ); + return DB_LOCK_DEADLOCK; }
/* Get write lock on the data */
--------------040402080004020608060006--