ITS#8007 Add maxentrysize config option

This commit is contained in:
Howard Chu 2014-10-21 13:15:55 +01:00
parent a8bfed69fd
commit d06f5e7c1b
7 changed files with 46 additions and 8 deletions

View file

@ -140,6 +140,11 @@ changing \fBindex\fP settings
dynamically by LDAPModifying "cn=config" automatically causes rebuilding dynamically by LDAPModifying "cn=config" automatically causes rebuilding
of the indices online in a background task. of the indices online in a background task.
.TP .TP
.BI maxentrysize \ <bytes>
Specify the maximum size of an entry in bytes. Attempts to store
an entry larger than this size will be rejected with the error
LDAP_ADMINLIMIT_EXCEEDED. The default is 0, which is unlimited.
.TP
.BI maxreaders \ <integer> .BI maxreaders \ <integer>
Specify the maximum number of threads that may have concurrent read access Specify the maximum number of threads that may have concurrent read access
to the database. Tools such as slapcat count as a single thread, to the database. Tools such as slapcat count as a single thread,

View file

@ -335,8 +335,12 @@ mdb_add(Operation *op, SlapReply *rs )
Debug( LDAP_DEBUG_TRACE, Debug( LDAP_DEBUG_TRACE,
LDAP_XSTRING(mdb_add) ": id2entry_add failed\n", LDAP_XSTRING(mdb_add) ": id2entry_add failed\n",
0, 0, 0 ); 0, 0, 0 );
rs->sr_err = LDAP_OTHER; if ( rs->sr_err == LDAP_ADMINLIMIT_EXCEEDED ) {
rs->sr_text = "entry store failed"; rs->sr_text = "entry is too big";
} else {
rs->sr_err = LDAP_OTHER;
rs->sr_text = "entry store failed";
}
goto return_results; goto return_results;
} }

View file

@ -61,13 +61,13 @@ struct mdb_info {
MDB_env *mi_dbenv; MDB_env *mi_dbenv;
/* DB_ENV parameters */ /* DB_ENV parameters */
/* The DB_ENV can be tuned via DB_CONFIG */
char *mi_dbenv_home; char *mi_dbenv_home;
uint32_t mi_dbenv_flags; uint32_t mi_dbenv_flags;
int mi_dbenv_mode; int mi_dbenv_mode;
size_t mi_mapsize; size_t mi_mapsize;
ID mi_nextid; ID mi_nextid;
size_t mi_maxentrysize;
slap_mask_t mi_defaultmask; slap_mask_t mi_defaultmask;
int mi_nattrs; int mi_nattrs;

View file

@ -39,7 +39,8 @@ enum {
MDB_MAXREADERS, MDB_MAXREADERS,
MDB_MAXSIZE, MDB_MAXSIZE,
MDB_MODE, MDB_MODE,
MDB_SSTACK MDB_SSTACK,
MDB_MAXENTSZ
}; };
static ConfigTable mdbcfg[] = { static ConfigTable mdbcfg[] = {
@ -66,6 +67,10 @@ static ConfigTable mdbcfg[] = {
"DESC 'Attribute index parameters' " "DESC 'Attribute index parameters' "
"EQUALITY caseIgnoreMatch " "EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString )", NULL, NULL }, "SYNTAX OMsDirectoryString )", NULL, NULL },
{ "maxentrysize", "size", 2, 2, 0, ARG_ULONG|ARG_MAGIC|MDB_MAXENTSZ,
mdb_cf_gen, "( OLcfgDbAt:12.3 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, { "maxreaders", "num", 2, 2, 0, ARG_UINT|ARG_MAGIC|MDB_MAXREADERS,
mdb_cf_gen, "( OLcfgDbAt:12.1 NAME 'olcDbMaxReaders' " mdb_cf_gen, "( OLcfgDbAt:12.1 NAME 'olcDbMaxReaders' "
"DESC 'Maximum number of threads that may access the DB concurrently' " "DESC 'Maximum number of threads that may access the DB concurrently' "
@ -95,7 +100,7 @@ static ConfigOCs mdbocs[] = {
"MUST olcDbDirectory " "MUST olcDbDirectory "
"MAY ( olcDbCheckpoint $ olcDbEnvFlags $ " "MAY ( olcDbCheckpoint $ olcDbEnvFlags $ "
"olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxsize $ " "olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxsize $ "
"olcDbMode $ olcDbSearchStack ) )", "olcDbMode $ olcDbSearchStack $ olcDbMaxEntrySize ) )",
Cft_Database, mdbcfg }, Cft_Database, mdbcfg },
{ NULL, 0, NULL } { NULL, 0, NULL }
}; };
@ -329,6 +334,10 @@ mdb_cf_gen( ConfigArgs *c )
c->value_int = mdb->mi_search_stack_depth; c->value_int = mdb->mi_search_stack_depth;
break; break;
case MDB_MAXENTSZ:
c->value_ulong = mdb->mi_maxentrysize;
break;
case MDB_MAXREADERS: case MDB_MAXREADERS:
c->value_int = mdb->mi_readers; c->value_int = mdb->mi_readers;
break; break;
@ -355,6 +364,10 @@ mdb_cf_gen( ConfigArgs *c )
case MDB_MAXSIZE: case MDB_MAXSIZE:
break; break;
case MDB_MAXENTSZ:
mdb->mi_maxentrysize = 0;
break;
case MDB_CHKPT: case MDB_CHKPT:
if ( mdb->mi_txn_cp_task ) { if ( mdb->mi_txn_cp_task ) {
struct re_s *re = mdb->mi_txn_cp_task; struct re_s *re = mdb->mi_txn_cp_task;
@ -651,6 +664,10 @@ mdb_cf_gen( ConfigArgs *c )
mdb->mi_search_stack_depth = c->value_int; mdb->mi_search_stack_depth = c->value_int;
break; break;
case MDB_MAXENTSZ:
mdb->mi_maxentrysize = c->value_ulong;
break;
case MDB_MAXREADERS: case MDB_MAXREADERS:
mdb->mi_readers = c->value_int; mdb->mi_readers = c->value_int;
if ( mdb->mi_flags & MDB_IS_OPEN ) { if ( mdb->mi_flags & MDB_IS_OPEN ) {

View file

@ -63,6 +63,9 @@ static int mdb_id2entry_put(
if (e->e_id < mdb->mi_nextid) if (e->e_id < mdb->mi_nextid)
flag &= ~MDB_APPEND; flag &= ~MDB_APPEND;
if (mdb->mi_maxentrysize && ec.len > mdb->mi_maxentrysize)
return LDAP_ADMINLIMIT_EXCEEDED;
again: again:
data.mv_size = ec.len; data.mv_size = ec.len;
if ( mc ) if ( mc )

View file

@ -601,7 +601,12 @@ mdb_modify( Operation *op, SlapReply *rs )
Debug( LDAP_DEBUG_TRACE, Debug( LDAP_DEBUG_TRACE,
LDAP_XSTRING(mdb_modify) ": id2entry update failed " "(%d)\n", LDAP_XSTRING(mdb_modify) ": id2entry update failed " "(%d)\n",
rs->sr_err, 0, 0 ); rs->sr_err, 0, 0 );
rs->sr_text = "entry update failed"; if ( rs->sr_err == LDAP_ADMINLIMIT_EXCEEDED ) {
rs->sr_text = "entry too big";
} else {
rs->sr_err = LDAP_OTHER;
rs->sr_text = "entry update failed";
}
goto return_results; goto return_results;
} }

View file

@ -487,8 +487,12 @@ mdb_modrdn( Operation *op, SlapReply *rs )
"<=- " LDAP_XSTRING(mdb_modrdn) "<=- " LDAP_XSTRING(mdb_modrdn)
": id2entry failed: %s (%d)\n", ": id2entry failed: %s (%d)\n",
mdb_strerror(rs->sr_err), rs->sr_err, 0 ); mdb_strerror(rs->sr_err), rs->sr_err, 0 );
rs->sr_err = LDAP_OTHER; if ( rs->sr_err == LDAP_ADMINLIMIT_EXCEEDED ) {
rs->sr_text = "entry update failed"; rs->sr_text = "entry too big";
} else {
rs->sr_err = LDAP_OTHER;
rs->sr_text = "entry update failed";
}
goto return_results; goto return_results;
} }