mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-01 04:29:35 -05:00
Fix for dynamic adds
This commit is contained in:
parent
ec7a05adff
commit
e60536c04a
1 changed files with 95 additions and 50 deletions
|
|
@ -185,15 +185,16 @@ typedef struct cache_manager_s {
|
|||
int numattrsets; /* number of attribute sets */
|
||||
int cur_entries; /* current number of entries cached */
|
||||
int max_entries; /* max number of entries cached */
|
||||
int num_entries_limit; /* max # of entries in a cacheable query */
|
||||
int num_entries_limit; /* max # of entries in a cacheable query */
|
||||
|
||||
char response_cb; /* install the response callback
|
||||
* at the tail of the callback list */
|
||||
#define PCACHE_RESPONSE_CB_HEAD 0
|
||||
#define PCACHE_RESPONSE_CB_TAIL 1
|
||||
char defer_db_open; /* defer open for online add */
|
||||
|
||||
time_t cc_period; /* interval between successive consistency checks (sec) */
|
||||
int cc_paused;
|
||||
int cc_paused;
|
||||
void *cc_arg;
|
||||
|
||||
ldap_pvt_thread_mutex_t cache_mutex;
|
||||
|
|
@ -2499,7 +2500,7 @@ consistency_check(
|
|||
op->o_dn = cm->db.be_rootdn;
|
||||
op->o_ndn = cm->db.be_rootndn;
|
||||
|
||||
cm->cc_arg = arg;
|
||||
cm->cc_arg = arg;
|
||||
|
||||
for (templ = qm->templates; templ; templ=templ->qmnext) {
|
||||
query = templ->query_last;
|
||||
|
|
@ -2610,6 +2611,15 @@ static ConfigTable pccfg[] = {
|
|||
{ NULL, NULL, 0, 0, 0, ARG_IGNORED }
|
||||
};
|
||||
|
||||
/* Need to no-op this keyword for dynamic config */
|
||||
static ConfigTable pcdummy[] = {
|
||||
{ "", "", 0, 0, 0, ARG_IGNORED,
|
||||
NULL, "( OLcfgGlAt:13 NAME 'olcDatabase' "
|
||||
"DESC 'The backend type for a database instance' "
|
||||
"SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", NULL, NULL },
|
||||
{ NULL, NULL, 0, 0, 0, ARG_IGNORED }
|
||||
};
|
||||
|
||||
static ConfigOCs pcocs[] = {
|
||||
{ "( OLcfgOvOc:2.1 "
|
||||
"NAME 'olcPcacheConfig' "
|
||||
|
|
@ -2621,10 +2631,19 @@ static ConfigOCs pcocs[] = {
|
|||
{ "( OLcfgOvOc:2.2 "
|
||||
"NAME 'olcPcacheDatabase' "
|
||||
"DESC 'Cache database configuration' "
|
||||
"AUXILIARY )", Cft_Misc, pccfg, pc_ldadd },
|
||||
"AUXILIARY )", Cft_Misc, pcdummy, pc_ldadd },
|
||||
{ NULL, 0, NULL }
|
||||
};
|
||||
|
||||
static int pcache_db_open2( slap_overinst *on, ConfigReply *cr );
|
||||
|
||||
static int
|
||||
pc_ldadd_cleanup( ConfigArgs *c )
|
||||
{
|
||||
slap_overinst *on = c->private;
|
||||
return pcache_db_open2( on, &c->reply );
|
||||
}
|
||||
|
||||
static int
|
||||
pc_ldadd( CfEntryInfo *p, Entry *e, ConfigArgs *ca )
|
||||
{
|
||||
|
|
@ -2638,6 +2657,8 @@ pc_ldadd( CfEntryInfo *p, Entry *e, ConfigArgs *ca )
|
|||
on = (slap_overinst *)p->ce_bi;
|
||||
cm = on->on_bi.bi_private;
|
||||
ca->be = &cm->db;
|
||||
ca->cleanup = pc_ldadd_cleanup;
|
||||
ca->private = on;
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -2826,6 +2847,9 @@ pc_cf_gen( ConfigArgs *c )
|
|||
Debug( LDAP_DEBUG_CONFIG, "%s: %s.\n", c->log, c->cr_msg, 0 );
|
||||
return( 1 );
|
||||
}
|
||||
if ( CONFIG_ONLINE_ADD( c ))
|
||||
cm->defer_db_open = 1;
|
||||
|
||||
cm->cc_period = (time_t)t;
|
||||
Debug( pcache_debug,
|
||||
"Total # of attribute sets to be cached = %d.\n",
|
||||
|
|
@ -3093,8 +3117,10 @@ pcache_db_init(
|
|||
cm->max_queries = 10000;
|
||||
cm->save_queries = 0;
|
||||
cm->response_cb = PCACHE_RESPONSE_CB_TAIL;
|
||||
cm->defer_db_open = 0;
|
||||
cm->cc_period = 1000;
|
||||
cm->cc_paused = 0;
|
||||
cm->cc_arg = NULL;
|
||||
|
||||
qm->attr_sets = NULL;
|
||||
qm->templates = NULL;
|
||||
|
|
@ -3149,55 +3175,13 @@ pcache_cachedquery_count_cb( Operation *op, SlapReply *rs )
|
|||
}
|
||||
|
||||
static int
|
||||
pcache_db_open(
|
||||
BackendDB *be,
|
||||
pcache_db_open2(
|
||||
slap_overinst *on,
|
||||
ConfigReply *cr )
|
||||
{
|
||||
slap_overinst *on = (slap_overinst *)be->bd_info;
|
||||
cache_manager *cm = on->on_bi.bi_private;
|
||||
query_manager* qm = cm->qm;
|
||||
int i, ncf = 0, rf = 0, nrf = 0, rc = 0;
|
||||
|
||||
/* check attr sets */
|
||||
for ( i = 0; i < cm->numattrsets; i++) {
|
||||
if ( !( qm->attr_sets[i].flags & PC_CONFIGURED ) ) {
|
||||
if ( qm->attr_sets[i].flags & PC_REFERENCED ) {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: attr set #%d not configured but referenced.\n", i, 0, 0 );
|
||||
rf++;
|
||||
|
||||
} else {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: warning, attr set #%d not configured.\n", i, 0, 0 );
|
||||
}
|
||||
ncf++;
|
||||
|
||||
} else if ( !( qm->attr_sets[i].flags & PC_REFERENCED ) ) {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: attr set #%d configured but not referenced.\n", i, 0, 0 );
|
||||
nrf++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ncf || rf || nrf ) {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: warning, %d attr sets configured but not referenced.\n", nrf, 0, 0 );
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: warning, %d attr sets not configured.\n", ncf, 0, 0 );
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: %d attr sets not configured but referenced.\n", rf, 0, 0 );
|
||||
|
||||
if ( rf > 0 ) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* need to inherit something from the original database... */
|
||||
cm->db.be_def_limit = be->be_def_limit;
|
||||
cm->db.be_limits = be->be_limits;
|
||||
cm->db.be_acl = be->be_acl;
|
||||
cm->db.be_dfltaccess = be->be_dfltaccess;
|
||||
|
||||
if ( SLAP_DBMONITORING( be ) ) {
|
||||
SLAP_DBFLAGS( &cm->db ) |= SLAP_DBFLAG_MONITORING;
|
||||
|
||||
} else {
|
||||
SLAP_DBFLAGS( &cm->db ) &= ~SLAP_DBFLAG_MONITORING;
|
||||
}
|
||||
int rc;
|
||||
|
||||
rc = backend_startup_one( &cm->db, NULL );
|
||||
|
||||
|
|
@ -3206,7 +3190,7 @@ pcache_db_open(
|
|||
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
|
||||
ldap_pvt_runqueue_insert( &slapd_rq, cm->cc_period,
|
||||
consistency_check, on,
|
||||
"pcache_consistency", be->be_suffix[0].bv_val );
|
||||
"pcache_consistency", cm->db.be_suffix[0].bv_val );
|
||||
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
|
||||
|
||||
/* Cached database must have the rootdn */
|
||||
|
|
@ -3304,6 +3288,62 @@ pcache_db_open(
|
|||
rc = 0;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
pcache_db_open(
|
||||
BackendDB *be,
|
||||
ConfigReply *cr )
|
||||
{
|
||||
slap_overinst *on = (slap_overinst *)be->bd_info;
|
||||
cache_manager *cm = on->on_bi.bi_private;
|
||||
query_manager* qm = cm->qm;
|
||||
int i, ncf = 0, rf = 0, nrf = 0, rc = 0;
|
||||
|
||||
/* check attr sets */
|
||||
for ( i = 0; i < cm->numattrsets; i++) {
|
||||
if ( !( qm->attr_sets[i].flags & PC_CONFIGURED ) ) {
|
||||
if ( qm->attr_sets[i].flags & PC_REFERENCED ) {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: attr set #%d not configured but referenced.\n", i, 0, 0 );
|
||||
rf++;
|
||||
|
||||
} else {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: warning, attr set #%d not configured.\n", i, 0, 0 );
|
||||
}
|
||||
ncf++;
|
||||
|
||||
} else if ( !( qm->attr_sets[i].flags & PC_REFERENCED ) ) {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: attr set #%d configured but not referenced.\n", i, 0, 0 );
|
||||
nrf++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ncf || rf || nrf ) {
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: warning, %d attr sets configured but not referenced.\n", nrf, 0, 0 );
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: warning, %d attr sets not configured.\n", ncf, 0, 0 );
|
||||
Debug( LDAP_DEBUG_CONFIG, "pcache: %d attr sets not configured but referenced.\n", rf, 0, 0 );
|
||||
|
||||
if ( rf > 0 ) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* need to inherit something from the original database... */
|
||||
cm->db.be_def_limit = be->be_def_limit;
|
||||
cm->db.be_limits = be->be_limits;
|
||||
cm->db.be_acl = be->be_acl;
|
||||
cm->db.be_dfltaccess = be->be_dfltaccess;
|
||||
|
||||
if ( SLAP_DBMONITORING( be ) ) {
|
||||
SLAP_DBFLAGS( &cm->db ) |= SLAP_DBFLAG_MONITORING;
|
||||
|
||||
} else {
|
||||
SLAP_DBFLAGS( &cm->db ) &= ~SLAP_DBFLAG_MONITORING;
|
||||
}
|
||||
|
||||
if ( !cm->defer_db_open )
|
||||
rc = pcache_db_open2( on, cr );
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
@ -3904,6 +3944,11 @@ pcache_initialize()
|
|||
code = config_register_schema( pccfg, pcocs );
|
||||
if ( code ) return code;
|
||||
|
||||
{
|
||||
const char *text;
|
||||
code = slap_str2ad( "olcDatabase", &pcdummy[0].ad, &text );
|
||||
if ( code ) return code;
|
||||
}
|
||||
return overlay_register( &pcache );
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue