mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-23 14:09:39 +08:00
Add dbpagesize keyword for configuring DB file page sizes
This commit is contained in:
parent
742f3a2a2c
commit
81ed60c056
servers/slapd/back-bdb
@ -156,6 +156,12 @@ struct bdb_db_info {
|
||||
DB *bdi_db;
|
||||
};
|
||||
|
||||
struct bdb_db_pgsize {
|
||||
struct bdb_db_pgsize *bdp_next;
|
||||
struct berval bdp_name;
|
||||
int bdp_size;
|
||||
};
|
||||
|
||||
#ifdef LDAP_DEVEL
|
||||
#define BDB_MONITOR_IDX
|
||||
#endif /* LDAP_DEVEL */
|
||||
@ -178,9 +184,10 @@ struct bdb_info {
|
||||
int bi_dbenv_mode;
|
||||
|
||||
int bi_ndatabases;
|
||||
int bi_db_opflags; /* db-specific flags */
|
||||
struct bdb_db_info **bi_databases;
|
||||
ldap_pvt_thread_mutex_t bi_database_mutex;
|
||||
int bi_db_opflags; /* db-specific flags */
|
||||
struct bdb_db_pgsize *bi_pagesizes;
|
||||
|
||||
slap_mask_t bi_defaultmask;
|
||||
Cache bi_cache;
|
||||
|
@ -50,7 +50,8 @@ enum {
|
||||
BDB_INDEX,
|
||||
BDB_LOCKD,
|
||||
BDB_SSTACK,
|
||||
BDB_MODE
|
||||
BDB_MODE,
|
||||
BDB_PGSIZE
|
||||
};
|
||||
|
||||
static ConfigTable bdbcfg[] = {
|
||||
@ -89,6 +90,11 @@ static ConfigTable bdbcfg[] = {
|
||||
bdb_cf_gen, "( OLcfgDbAt:1.4 NAME 'olcDbNoSync' "
|
||||
"DESC 'Disable synchronous database writes' "
|
||||
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
|
||||
{ "dbpagesize", "db> <size", 3, 3, 0, ARG_MAGIC|BDB_PGSIZE,
|
||||
bdb_cf_gen, "( OLcfgDbAt:1.15 NAME 'olcDbPageSize' "
|
||||
"DESC 'Page size of specified DB, in Kbytes' "
|
||||
"EQUALITY caseExactMatch "
|
||||
"SYNTAX OMsDirectoryString )", NULL, NULL },
|
||||
{ "dirtyread", NULL, 1, 2, 0,
|
||||
#ifdef SLAP_BDB_ALLOW_DIRTY_READ
|
||||
ARG_ON_OFF|ARG_MAGIC|BDB_DIRTYR, bdb_cf_gen,
|
||||
@ -157,7 +163,7 @@ static ConfigOCs bdbocs[] = {
|
||||
"olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ "
|
||||
"olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ "
|
||||
"olcDbMode $ olcDbSearchStack $ olcDbShmKey $ "
|
||||
"olcDbCacheFree $ olcDbDNcacheSize ) )",
|
||||
"olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )",
|
||||
Cft_Database, bdbcfg },
|
||||
{ NULL, 0, NULL }
|
||||
};
|
||||
@ -483,6 +489,23 @@ bdb_cf_gen( ConfigArgs *c )
|
||||
case BDB_SSTACK:
|
||||
c->value_int = bdb->bi_search_stack_depth;
|
||||
break;
|
||||
|
||||
case BDB_PGSIZE: {
|
||||
struct bdb_db_pgsize *ps;
|
||||
char buf[SLAP_TEXT_BUFLEN];
|
||||
struct berval bv;
|
||||
int rc = 1;
|
||||
|
||||
bv.bv_val = buf;
|
||||
for ( ps = bdb->bi_pagesizes; ps; ps = ps->bdp_next ) {
|
||||
bv.bv_len = sprintf( buf, "%s %d", ps->bdp_name.bv_val,
|
||||
ps->bdp_size / 1024 );
|
||||
value_add_one( &c->rvalue_vals, &bv );
|
||||
rc = 0;
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
} else if ( c->op == LDAP_MOD_DELETE ) {
|
||||
@ -608,6 +631,24 @@ bdb_cf_gen( ConfigArgs *c )
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* doesn't make sense on the fly; the DB file must be
|
||||
* recreated
|
||||
*/
|
||||
case BDB_PGSIZE: {
|
||||
struct bdb_db_pgsize *ps, **prev;
|
||||
int i;
|
||||
|
||||
for ( i = 0, prev = &bdb->bi_pagesizes, ps = *prev; ps;
|
||||
prev = &ps->bdp_next, ps = ps->bdp_next, i++ ) {
|
||||
if ( c->valx == -1 || i == c->valx ) {
|
||||
*prev = ps->bdp_next;
|
||||
ch_free( ps );
|
||||
ps = *prev;
|
||||
if ( i == c->valx ) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@ -841,6 +882,31 @@ bdb_cf_gen( ConfigArgs *c )
|
||||
}
|
||||
bdb->bi_search_stack_depth = c->value_int;
|
||||
break;
|
||||
|
||||
case BDB_PGSIZE: {
|
||||
struct bdb_db_pgsize *ps, **prev;
|
||||
int i, s;
|
||||
|
||||
s = atoi(c->argv[2]);
|
||||
if ( s < 1 || s > 64 ) {
|
||||
snprintf( c->cr_msg, sizeof( c->cr_msg ),
|
||||
"%s: size must be > 0 and <= 64: %d",
|
||||
c->log, s );
|
||||
Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 );
|
||||
return -1;
|
||||
}
|
||||
i = strlen(c->argv[1]);
|
||||
ps = ch_malloc( sizeof(struct bdb_db_pgsize) + i + 1 );
|
||||
ps->bdp_next = NULL;
|
||||
ps->bdp_name.bv_len = i;
|
||||
ps->bdp_name.bv_val = (char *)(ps+1);
|
||||
strcpy( ps->bdp_name.bv_val, c->argv[1] );
|
||||
ps->bdp_size = s * 1024;
|
||||
for ( prev = &bdb->bi_pagesizes; *prev; prev = &(*prev)->bdp_next )
|
||||
;
|
||||
*prev = ps;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -57,6 +57,29 @@ bdb_db_hash(
|
||||
#define BDB_INDEXTYPE DB_BTREE
|
||||
#endif
|
||||
|
||||
/* If a configured size is found, return it, otherwise return 0 */
|
||||
int
|
||||
bdb_db_findsize(
|
||||
struct bdb_info *bdb,
|
||||
struct berval *name
|
||||
)
|
||||
{
|
||||
struct bdb_db_pgsize *bp;
|
||||
int rc;
|
||||
|
||||
for ( bp = bdb->bi_pagesizes; bp; bp=bp->bdp_next ) {
|
||||
rc = strncmp( name->bv_val, bp->bdp_name.bv_val, name->bv_len );
|
||||
if ( !rc ) {
|
||||
if ( name->bv_len == bp->bdp_name.bv_len )
|
||||
return bp->bdp_size;
|
||||
if ( name->bv_len < bp->bdp_name.bv_len &&
|
||||
bp->bdp_name.bv_val[name->bv_len] == '.' )
|
||||
return bp->bdp_size;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bdb_db_cache(
|
||||
Backend *be,
|
||||
@ -121,7 +144,11 @@ bdb_db_cache(
|
||||
}
|
||||
}
|
||||
|
||||
rc = db->bdi_db->set_pagesize( db->bdi_db, BDB_PAGESIZE );
|
||||
/* If no explicit size set, use the default */
|
||||
flags = bdb_db_findsize( bdb, name );
|
||||
if ( !flags ) flags = BDB_PAGESIZE;
|
||||
rc = db->bdi_db->set_pagesize( db->bdi_db, flags );
|
||||
|
||||
#ifdef BDB_INDEX_USE_HASH
|
||||
rc = db->bdi_db->set_h_hash( db->bdi_db, bdb_db_hash );
|
||||
#endif
|
||||
|
@ -416,19 +416,25 @@ shm_retry:
|
||||
}
|
||||
}
|
||||
|
||||
rc = bdb_db_findsize( bdb, (struct berval *)&bdbi_databases[i].name );
|
||||
|
||||
if( i == BDB_ID2ENTRY ) {
|
||||
if ( !rc ) rc = BDB_ID2ENTRY_PAGESIZE;
|
||||
rc = db->bdi_db->set_pagesize( db->bdi_db, rc );
|
||||
|
||||
if ( slapMode & SLAP_TOOL_MODE )
|
||||
db->bdi_db->mpf->set_priority( db->bdi_db->mpf,
|
||||
DB_PRIORITY_VERY_LOW );
|
||||
|
||||
rc = db->bdi_db->set_pagesize( db->bdi_db,
|
||||
BDB_ID2ENTRY_PAGESIZE );
|
||||
if ( slapMode & SLAP_TOOL_READMAIN ) {
|
||||
flags |= DB_RDONLY;
|
||||
} else {
|
||||
flags |= DB_CREATE;
|
||||
}
|
||||
} else {
|
||||
if ( !rc ) rc = BDB_PAGESIZE;
|
||||
rc = db->bdi_db->set_pagesize( db->bdi_db, rc );
|
||||
|
||||
rc = db->bdi_db->set_flags( db->bdi_db,
|
||||
DB_DUP | DB_DUPSORT );
|
||||
#ifndef BDB_HIER
|
||||
@ -446,8 +452,6 @@ shm_retry:
|
||||
flags |= DB_CREATE;
|
||||
}
|
||||
#endif
|
||||
rc = db->bdi_db->set_pagesize( db->bdi_db,
|
||||
BDB_PAGESIZE );
|
||||
}
|
||||
|
||||
#ifdef HAVE_EBCDIC
|
||||
|
@ -70,6 +70,7 @@ int bdb_back_init_cf( BackendInfo *bi );
|
||||
* dbcache.c
|
||||
*/
|
||||
#define bdb_db_cache BDB_SYMBOL(db_cache)
|
||||
#define bdb_db_findsize BDB_SYMBOL(db_findsize)
|
||||
|
||||
int
|
||||
bdb_db_cache(
|
||||
@ -77,6 +78,11 @@ bdb_db_cache(
|
||||
struct berval *name,
|
||||
DB **db );
|
||||
|
||||
int
|
||||
bdb_db_findsize(
|
||||
struct bdb_info *bdb,
|
||||
struct berval *name );
|
||||
|
||||
/*
|
||||
* dn2entry.c
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user