]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/id2entry.c
Patch: Delete the buggy surrogate parent code (ITS#1815)
[openldap] / servers / slapd / back-bdb / id2entry.c
index 10ec1637a58aacd6baff8e40cd27354fbedacbc0..9c8c9657e4e46aef515193ff8c68254cd38abc92 100644 (file)
@@ -80,13 +80,15 @@ int bdb_id2entry_rw(
        DB_TXN *tid,
        ID id,
        Entry **e,
-       int rw )
+       int rw,
+       u_int32_t locker,
+       DB_LOCK *lock )
 {
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        DB *db = bdb->bi_id2entry->bdi_db;
        DBT key, data;
        struct berval bv;
-       int rc = 0;
+       int rc = 0, ret = 0;
 
        *e = NULL;
 
@@ -97,12 +99,12 @@ int bdb_id2entry_rw(
        DBTzero( &data );
        data.flags = DB_DBT_MALLOC;
 
-       if ((*e = bdb_cache_find_entry_id(&bdb->bi_cache, id, rw)) != NULL) {
+       if ((*e = bdb_cache_find_entry_id(bdb->bi_dbenv, &bdb->bi_cache, id, rw, locker, lock)) != NULL) {
                return 0;
        }
 
        /* fetch it */
-       rc = db->get( db, tid, &key, &data, bdb->bi_db_opflags );
+       rc = db->get( db, tid, &key, &data, bdb->bi_db_opflags | ( rw ? DB_RMW : 0 ));
 
        if( rc != 0 ) {
                return rc;
@@ -121,30 +123,41 @@ int bdb_id2entry_rw(
                ch_free( data.data );
        }
 
-       while (rc == 0 && bdb_cache_add_entry_rw(&bdb->bi_cache, *e, rw) != 0) {
-               Entry *ee;
-               int add_loop_cnt = 0;
-               if ( (*e)->e_private != NULL ) {
-                       free ((*e)->e_private);
-               }
-               (*e)->e_private = NULL;
-               if ( (ee = bdb_cache_find_entry_id
-                               (&bdb->bi_cache, id, rw) ) != NULL) {
-                       bdb_entry_return ( *e );
-                       *e = ee;
-                       return 0;
+       if ( rc == 0 ) {
+#ifdef BDB_HIER
+               bdb_fix_dn(be, id, *e);
+#endif
+               ret = bdb_cache_add_entry_rw( bdb->bi_dbenv,
+                               &bdb->bi_cache, *e, rw, locker, lock);
+               while ( ret == 1 || ret == -1 ) {
+                       Entry *ee;
+                       int add_loop_cnt = 0;
+                       if ( (*e)->e_private != NULL ) {
+                               free ((*e)->e_private);
+                       }
+                       (*e)->e_private = NULL;
+                       if ( (ee = bdb_cache_find_entry_id
+                                       (bdb->bi_dbenv, &bdb->bi_cache, id, rw, locker, lock) ) != NULL) {
+                               bdb_entry_return ( *e );
+                               *e = ee;
+                               return 0;
+                       }
+                       if ( ++add_loop_cnt == BDB_MAX_ADD_LOOP ) {
+                               bdb_entry_return ( *e );
+                               *e = NULL;
+                               return LDAP_BUSY;
+                       }
                }
-               if ( ++add_loop_cnt == BDB_MAX_ADD_LOOP ) {
-                       bdb_entry_return ( *e );
+               if ( ret != 0 ) {
+                       if ( (*e)->e_private != NULL )
+                               free ( (*e)->e_private );
+                       bdb_entry_return( *e );
                        *e = NULL;
-                       return LDAP_BUSY;
+                       ch_free( data.data );
                }
+               rc = ret;
        }
 
-#ifdef BDB_HIER
-       bdb_fix_dn(be, id, *e);
-#endif
-
        if (rc == 0) {
                bdb_cache_entry_commit(*e);
        }
@@ -232,7 +245,7 @@ int bdb_entry_release(
  
        if ( slapMode == SLAP_SERVER_MODE ) {
                /* free entry and reader or writer lock */
-               bdb_cache_return_entry_rw( &bdb->bi_cache, e, rw );
+               bdb_unlocked_cache_return_entry_rw( &bdb->bi_cache, e, rw );
        } else {
                if (e->e_private != NULL)
                        free (e->e_private);