]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-mdb/config.c
Fix online reconfig
[openldap] / servers / slapd / back-mdb / config.c
index b21dbee35e95cc54ed5f675444ab0454e89f621f..fb516a5dc554fac6e4a0e2d204c81b88125571e0 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2011 The OpenLDAP Foundation.
+ * Copyright 2000-2012 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,7 +38,7 @@ enum {
        MDB_MAXREADERS,
        MDB_MAXSIZE,
        MDB_MODE,
-       MDB_SSTACK,
+       MDB_SSTACK
 };
 
 static ConfigTable mdbcfg[] = {
@@ -134,14 +134,13 @@ mdb_online_index( void *ctx, void *arg )
        op->o_bd = be;
 
        id = 1;
-       key.mv_data = &id;
        key.mv_size = sizeof(ID);
 
        while ( 1 ) {
                if ( slapd_shutdown )
                        break;
 
-               rc = mdb_txn_begin( mdb->mi_dbenv, 0, &txn );
+               rc = mdb_txn_begin( mdb->mi_dbenv, NULL, 0, &txn );
                if ( rc )
                        break;
                rc = mdb_cursor_open( txn, mdb->mi_id2entry, &curs );
@@ -151,6 +150,7 @@ mdb_online_index( void *ctx, void *arg )
                }
                if ( getnext ) {
                        getnext = 0;
+                       key.mv_data = &id;
                        rc = mdb_cursor_get( curs, &key, &data, MDB_SET_RANGE );
                        if ( rc ) {
                                mdb_txn_abort( txn );
@@ -173,9 +173,13 @@ mdb_online_index( void *ctx, void *arg )
                        break;
                }
                rc = mdb_index_entry( op, txn, MDB_INDEX_UPDATE_OP, e );
+               mdb_entry_return( op, e );
                if ( rc == 0 ) {
                        rc = mdb_txn_commit( txn );
                        txn = NULL;
+               } else {
+                       mdb_txn_abort( txn );
+                       txn = NULL;
                }
                if ( rc )
                        break;
@@ -563,14 +567,18 @@ mdb_cf_gen( ConfigArgs *c )
 
        case MDB_MAXREADERS:
                mdb->mi_readers = c->value_int;
-               if ( mdb->mi_flags & MDB_IS_OPEN )
+               if ( mdb->mi_flags & MDB_IS_OPEN ) {
                        mdb->mi_flags |= MDB_RE_OPEN;
+                       c->cleanup = mdb_cf_cleanup;
+               }
                break;
 
        case MDB_MAXSIZE:
                mdb->mi_mapsize = c->value_ulong;
-               if ( mdb->mi_flags & MDB_IS_OPEN )
+               if ( mdb->mi_flags & MDB_IS_OPEN ) {
                        mdb->mi_flags |= MDB_RE_OPEN;
+                       c->cleanup = mdb_cf_cleanup;
+               }
                break;
 
        }