]> git.sur5r.net Git - openldap/commitdiff
Partial fix for ITS#3188.
authorKurt Zeilenga <kurt@openldap.org>
Tue, 15 Jun 2004 21:13:40 +0000 (21:13 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 15 Jun 2004 21:13:40 +0000 (21:13 +0000)
As Howard noted, additional fixes may be needed in other update routines.

servers/slapd/back-bdb/cache.c
servers/slapd/back-bdb/modify.c

index e1fcc9812efb307c5bf4b198209140d3328d701c..ab8a71feea1a7bce826bbbe5e519a6815c38c9f5 100644 (file)
@@ -794,19 +794,20 @@ bdb_cache_modify(
        DB_LOCK *lock )
 {
        EntryInfo *ei = BEI(e);
-       
+       int rc = 0;     
        /* Get write lock on data */
-       bdb_cache_entry_db_relock( env, locker, ei, 1, 0, lock );
+       rc = bdb_cache_entry_db_relock( env, locker, ei, 1, 0, lock );
 
        /* If we've done repeated mods on a cached entry, then e_attrs
         * is no longer contiguous with the entry, and must be freed.
         */
-       if ( (void *)e->e_attrs != (void *)(e+1) ) {
-               attrs_free( e->e_attrs );
+       if ( ! rc ) {
+               if ( (void *)e->e_attrs != (void *)(e+1) ) {
+                       attrs_free( e->e_attrs ); 
+               }
+               e->e_attrs = newAttrs;
        }
-       e->e_attrs = newAttrs;
-
-       return 0;
+       return rc;
 }
 
 /*
index bc3e7ab48c63be92d058e35ed55befa808f96d4d..c8d65d789fb030cf8e0b65301b6aa1b96d0e9890 100644 (file)
@@ -659,7 +659,12 @@ retry:     /* transaction retry */
                        goto return_results;
                }
        } else {
-               bdb_cache_modify( e, dummy.e_attrs, bdb->bi_dbenv, locker, &lock );
+               rc = bdb_cache_modify( e, dummy.e_attrs, bdb->bi_dbenv, locker, &lock );
+               switch( rc ) {
+               case DB_LOCK_DEADLOCK:
+               case DB_LOCK_NOTGRANTED:
+                       goto retry;
+               }
 
                if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
                        if ( ctxcsn_added ) {