]> git.sur5r.net Git - openldap/commitdiff
ITS#7222 fix bdb/hdb cache hang under high load
authorHrvoje <hrvoje.habjanic@zg.t-com.hr>
Thu, 31 May 2012 17:48:38 +0000 (10:48 -0700)
committerHoward Chu <hyc@openldap.org>
Thu, 31 May 2012 17:48:38 +0000 (10:48 -0700)
servers/slapd/back-bdb/cache.c

index 6bca301129d229bdd6e1453a393f99ceb58279c3..dbe000e296fd3533aa144fe36d2faa0da5a470ca 100644 (file)
@@ -1361,7 +1361,7 @@ bdb_cache_delete(
     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_delete(
 
        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 @@ bdb_cache_delete(
                        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 */