]> git.sur5r.net Git - openldap/commitdiff
Once more, mutex_lock -> trylock...
authorQuanah Gibson-Mount <quanah@openldap.org>
Thu, 5 Mar 2009 23:24:28 +0000 (23:24 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 5 Mar 2009 23:24:28 +0000 (23:24 +0000)
Must use txns everywhere, otherwise it will deadlock

servers/slapd/back-bdb/operational.c
servers/slapd/syncrepl.c

index 86a475cc03bbfdcf4d734c6276c5cc4670c27c4b..4d71ce700195d9dc4fdb6d18b96aadddce3ecdf3 100644 (file)
@@ -34,6 +34,10 @@ bdb_hasSubordinates(
        Entry           *e,
        int             *hasSubordinates )
 {
+       struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
+       struct bdb_op_info      *opinfo;
+       OpExtra *oex;
+       DB_TXN          *rtxn;
        int             rc;
        
        assert( e != NULL );
@@ -47,12 +51,25 @@ bdb_hasSubordinates(
                return LDAP_OTHER;
        }
 
+       /* Check for a txn in a parent op, otherwise use reader txn */
+       LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+               if ( oex->oe_key == bdb )
+                       break;
+       }
+       opinfo = (struct bdb_op_info *) oex;
+       if ( opinfo && opinfo->boi_txn ) {
+               rtxn = opinfo->boi_txn;
+       } else {
+               rc = bdb_reader_get(op, bdb->bi_dbenv, &rtxn);
+               if ( rc ) return LDAP_OTHER;
+       }
+
 retry:
        /* FIXME: we can no longer assume the entry's e_private
         * field is correctly populated; so we need to reacquire
         * it with reader lock */
-       rc = bdb_cache_children( op, NULL, e );
-       
+       rc = bdb_cache_children( op, rtxn, e );
+
        switch( rc ) {
        case DB_LOCK_DEADLOCK:
        case DB_LOCK_NOTGRANTED:
index 8511fc4ddad29d3019e7da2f2a618a9e0cd55d65..7ad5c813ab76ea8a10c92108faf63184673ac47d 100644 (file)
@@ -1258,8 +1258,11 @@ do_syncrepl(
        if ( si == NULL )
                return NULL;
 
-       /* There will never be more than one instance active */
-       ldap_pvt_thread_mutex_lock( &si->si_mutex );
+       /* Don't get stuck here while a pause is initiated */
+       while ( ldap_pvt_thread_mutex_trylock( &si->si_mutex )) {
+               if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
+                       ldap_pvt_thread_yield();
+       }
 
        switch( abs( si->si_type ) ) {
        case LDAP_SYNC_REFRESH_ONLY: