]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-mdb/config.c
Happy New Year
[openldap] / servers / slapd / back-mdb / config.c
index fa11d8c1f3313be930a244edeab4694e55b2a8ed..c1995176e8985ad29090d5b03fb6272474eb23d0 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2013 The OpenLDAP Foundation.
+ * Copyright 2000-2015 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -39,7 +39,8 @@ enum {
        MDB_MAXREADERS,
        MDB_MAXSIZE,
        MDB_MODE,
-       MDB_SSTACK
+       MDB_SSTACK,
+       MDB_MAXENTSZ
 };
 
 static ConfigTable mdbcfg[] = {
@@ -59,12 +60,17 @@ static ConfigTable mdbcfg[] = {
        { "envflags", "flags", 2, 0, 0, ARG_MAGIC|MDB_ENVFLAGS,
                mdb_cf_gen, "( OLcfgDbAt:12.3 NAME 'olcDbEnvFlags' "
                        "DESC 'Database environment flags' "
+                       "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "index", "attr> <[pres,eq,approx,sub]", 2, 3, 0, ARG_MAGIC|MDB_INDEX,
                mdb_cf_gen, "( OLcfgDbAt:0.2 NAME 'olcDbIndex' "
                "DESC 'Attribute index parameters' "
                "EQUALITY caseIgnoreMatch "
                "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "maxentrysize", "size", 2, 2, 0, ARG_ULONG|ARG_MAGIC|MDB_MAXENTSZ,
+               mdb_cf_gen, "( OLcfgDbAt:12.4 NAME 'olcDbMaxEntrySize' "
+               "DESC 'Maximum size of an entry in bytes' "
+               "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
        { "maxreaders", "num", 2, 2, 0, ARG_UINT|ARG_MAGIC|MDB_MAXREADERS,
                mdb_cf_gen, "( OLcfgDbAt:12.1 NAME 'olcDbMaxReaders' "
                "DESC 'Maximum number of threads that may access the DB concurrently' "
@@ -93,8 +99,8 @@ static ConfigOCs mdbocs[] = {
                "SUP olcDatabaseConfig "
                "MUST olcDbDirectory "
                "MAY ( olcDbCheckpoint $ olcDbEnvFlags $ "
-               "olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxsize $ "
-               "olcDbMode $ olcDbSearchStack ) )",
+               "olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxSize $ "
+               "olcDbMode $ olcDbSearchStack $ olcDbMaxEntrySize ) )",
                        Cft_Database, mdbcfg },
        { NULL, 0, NULL }
 };
@@ -104,6 +110,7 @@ static slap_verbmasks mdb_envflags[] = {
        { BER_BVC("nometasync"),        MDB_NOMETASYNC },
        { BER_BVC("writemap"),  MDB_WRITEMAP },
        { BER_BVC("mapasync"),  MDB_MAPASYNC },
+       { BER_BVC("nordahead"), MDB_NORDAHEAD },
        { BER_BVNULL, 0 }
 };
 
@@ -114,7 +121,7 @@ mdb_checkpoint( void *ctx, void *arg )
        struct re_s *rtask = arg;
        struct mdb_info *mdb = rtask->arg;
 
-       mdb_env_sync( mdb->mi_dbenv, 0 );
+       mdb_env_sync( mdb->mi_dbenv, 1 );
        ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
        ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
        ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
@@ -327,6 +334,10 @@ mdb_cf_gen( ConfigArgs *c )
                        c->value_int = mdb->mi_search_stack_depth;
                        break;
 
+               case MDB_MAXENTSZ:
+                       c->value_ulong = mdb->mi_maxentrysize;
+                       break;
+
                case MDB_MAXREADERS:
                        c->value_int = mdb->mi_readers;
                        break;
@@ -353,6 +364,10 @@ mdb_cf_gen( ConfigArgs *c )
                case MDB_MAXSIZE:
                        break;
 
+               case MDB_MAXENTSZ:
+                       mdb->mi_maxentrysize = 0;
+                       break;
+
                case MDB_CHKPT:
                        if ( mdb->mi_txn_cp_task ) {
                                struct re_s *re = mdb->mi_txn_cp_task;
@@ -404,6 +419,9 @@ mdb_cf_gen( ConfigArgs *c )
                                        mdb->mi_dbenv_flags ^= mdb_envflags[i].mask;
                                } else {
                                        /* unknown keyword */
+                                       snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: unknown keyword \"%s\"",
+                                               c->argv[0], c->argv[i] );
+                                       Debug( LDAP_DEBUG_CONFIG, "%s %s\n", c->log, c->cr_msg, 0 );
                                        rc = 1;
                                }
                        }
@@ -606,7 +624,10 @@ mdb_cf_gen( ConfigArgs *c )
                                mdb->mi_dbenv_flags |= mdb_envflags[j].mask;
                        } else {
                                /* unknown keyword */
-                               rc = 1;
+                               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: unknown keyword \"%s\"",
+                                       c->argv[0], c->argv[i] );
+                               Debug( LDAP_DEBUG_ANY, "%s %s\n", c->log, c->cr_msg, 0 );
+                               return 1;
                        }
                }
                }
@@ -617,23 +638,25 @@ mdb_cf_gen( ConfigArgs *c )
                        c->argc - 1, &c->argv[1], &c->reply);
 
                if( rc != LDAP_SUCCESS ) return 1;
-               c->cleanup = mdb_cf_cleanup;
                mdb->mi_flags |= MDB_OPEN_INDEX;
-               if (( mdb->mi_flags & MDB_IS_OPEN ) && !mdb->mi_index_task ) {
-                       /* Start the task as soon as we finish here. Set a long
-                        * interval (10 hours) so that it only gets scheduled once.
-                        */
-                       if ( c->be->be_suffix == NULL || BER_BVISNULL( &c->be->be_suffix[0] ) ) {
-                               fprintf( stderr, "%s: "
-                                       "\"index\" must occur after \"suffix\".\n",
-                                       c->log );
-                               return 1;
+               if ( mdb->mi_flags & MDB_IS_OPEN ) {
+                       c->cleanup = mdb_cf_cleanup;
+                       if ( !mdb->mi_index_task ) {
+                               /* Start the task as soon as we finish here. Set a long
+                                * interval (10 hours) so that it only gets scheduled once.
+                                */
+                               if ( c->be->be_suffix == NULL || BER_BVISNULL( &c->be->be_suffix[0] ) ) {
+                                       fprintf( stderr, "%s: "
+                                               "\"index\" must occur after \"suffix\".\n",
+                                               c->log );
+                                       return 1;
+                               }
+                               ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+                               mdb->mi_index_task = ldap_pvt_runqueue_insert( &slapd_rq, 36000,
+                                       mdb_online_index, c->be,
+                                       LDAP_XSTRING(mdb_online_index), c->be->be_suffix[0].bv_val );
+                               ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
                        }
-                       ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
-                       mdb->mi_index_task = ldap_pvt_runqueue_insert( &slapd_rq, 36000,
-                               mdb_online_index, c->be,
-                               LDAP_XSTRING(mdb_online_index), c->be->be_suffix[0].bv_val );
-                       ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
                }
                break;
 
@@ -647,6 +670,10 @@ mdb_cf_gen( ConfigArgs *c )
                mdb->mi_search_stack_depth = c->value_int;
                break;
 
+       case MDB_MAXENTSZ:
+               mdb->mi_maxentrysize = c->value_ulong;
+               break;
+
        case MDB_MAXREADERS:
                mdb->mi_readers = c->value_int;
                if ( mdb->mi_flags & MDB_IS_OPEN ) {