version 1.41.2.15, 2006/02/17 02:07:35
|
version 1.41.2.16, 2006/02/17 07:38:41
|
Line 1
|
Line 1
|
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/pcache.c,v 1.41.2.14 2006/01/23 23:52:17 kurt Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/pcache.c,v 1.41.2.15 2006/02/17 02:07:35 hyc Exp $ */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 2003-2006 The OpenLDAP Foundation. |
* Copyright 2003-2006 The OpenLDAP Foundation. |
Line 136 typedef struct cache_manager_s {
|
Line 136 typedef struct cache_manager_s {
|
query_manager* qm; /* query cache managed by the cache manager */ |
query_manager* qm; /* query cache managed by the cache manager */ |
} cache_manager; |
} cache_manager; |
|
|
|
static int pcache_debug; |
|
|
static AttributeDescription *ad_queryid; |
static AttributeDescription *ad_queryid; |
static char *queryid_schema = "( 1.3.6.1.4.1.4203.666.1.12 NAME 'queryid' " |
static char *queryid_schema = "( 1.3.6.1.4.1.4203.666.1.12 NAME 'queryid' " |
"DESC 'list of queries the entry belongs to' " |
"DESC 'list of queries the entry belongs to' " |
Line 263 add_query_on_top (query_manager* qm, Cac
|
Line 265 add_query_on_top (query_manager* qm, Cac
|
|
|
qc->lru_down = top; |
qc->lru_down = top; |
qc->lru_up = NULL; |
qc->lru_up = NULL; |
Debug( LDAP_DEBUG_CACHE, "Base of added query = %s\n", |
Debug( pcache_debug, "Base of added query = %s\n", |
q->base.bv_val, 0, 0 ); |
q->base.bv_val, 0, 0 ); |
} |
} |
|
|
Line 492 query_containment(Operation *op, query_m
|
Line 494 query_containment(Operation *op, query_m
|
|
|
MatchingRule* mrule = NULL; |
MatchingRule* mrule = NULL; |
if (inputf != NULL) { |
if (inputf != NULL) { |
Debug( LDAP_DEBUG_CACHE, "Lock QC index = %d\n", |
Debug( pcache_debug, "Lock QC index = %d\n", |
template_index, 0, 0 ); |
template_index, 0, 0 ); |
ldap_pvt_thread_rdwr_rlock(&(templa[template_index].t_rwlock)); |
ldap_pvt_thread_rdwr_rlock(&(templa[template_index].t_rwlock)); |
for(qc=templa[template_index].query; qc != NULL; qc= qc->next) { |
for(qc=templa[template_index].query; qc != NULL; qc= qc->next) { |
Line 523 query_containment(Operation *op, query_m
|
Line 525 query_containment(Operation *op, query_m
|
&(fs->f_ava->aa_value), &text); |
&(fs->f_ava->aa_value), &text); |
if (rc != LDAP_SUCCESS) { |
if (rc != LDAP_SUCCESS) { |
ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock)); |
ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock)); |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"Unlock: Exiting QC index=%d\n", |
"Unlock: Exiting QC index=%d\n", |
template_index, 0, 0 ); |
template_index, 0, 0 ); |
return NULL; |
return NULL; |
Line 594 query_containment(Operation *op, query_m
|
Line 596 query_containment(Operation *op, query_m
|
} |
} |
} |
} |
} |
} |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"Not answerable: Unlock QC index=%d\n", |
"Not answerable: Unlock QC index=%d\n", |
template_index, 0, 0 ); |
template_index, 0, 0 ); |
ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock)); |
ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock)); |
Line 636 static void add_query(
|
Line 638 static void add_query(
|
} |
} |
new_cached_query->lru_up = NULL; |
new_cached_query->lru_up = NULL; |
new_cached_query->lru_down = NULL; |
new_cached_query->lru_down = NULL; |
Debug( LDAP_DEBUG_CACHE, "Added query expires at %ld\n", |
Debug( pcache_debug, "Added query expires at %ld\n", |
(long) new_cached_query->expiry_time, 0, 0 ); |
(long) new_cached_query->expiry_time, 0, 0 ); |
new_query = (Query*)new_cached_query; |
new_query = (Query*)new_cached_query; |
|
|
Line 646 static void add_query(
|
Line 648 static void add_query(
|
new_query->attrs = query->attrs; |
new_query->attrs = query->attrs; |
|
|
/* Adding a query */ |
/* Adding a query */ |
Debug( LDAP_DEBUG_CACHE, "Lock AQ index = %d\n", |
Debug( pcache_debug, "Lock AQ index = %d\n", |
template_index, 0, 0 ); |
template_index, 0, 0 ); |
ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock); |
ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock); |
if (templ->query == NULL) |
if (templ->query == NULL) |
Line 657 static void add_query(
|
Line 659 static void add_query(
|
new_cached_query->prev = NULL; |
new_cached_query->prev = NULL; |
templ->query = new_cached_query; |
templ->query = new_cached_query; |
templ->no_of_queries++; |
templ->no_of_queries++; |
Debug( LDAP_DEBUG_CACHE, "TEMPLATE %d QUERIES++ %d\n", |
Debug( pcache_debug, "TEMPLATE %d QUERIES++ %d\n", |
template_index, templ->no_of_queries, 0 ); |
template_index, templ->no_of_queries, 0 ); |
|
|
Debug( LDAP_DEBUG_CACHE, "Unlock AQ index = %d \n", |
Debug( pcache_debug, "Unlock AQ index = %d \n", |
template_index, 0, 0 ); |
template_index, 0, 0 ); |
ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock); |
ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock); |
|
|
Line 702 static void cache_replacement(query_mana
|
Line 704 static void cache_replacement(query_mana
|
result->bv_len = 0; |
result->bv_len = 0; |
|
|
if (!bottom) { |
if (!bottom) { |
Debug ( LDAP_DEBUG_CACHE, |
Debug ( pcache_debug, |
"Cache replacement invoked without " |
"Cache replacement invoked without " |
"any query in LRU list\n", 0, 0, 0 ); |
"any query in LRU list\n", 0, 0, 0 ); |
ldap_pvt_thread_mutex_unlock(&qm->lru_mutex); |
ldap_pvt_thread_mutex_unlock(&qm->lru_mutex); |
Line 716 static void cache_replacement(query_mana
|
Line 718 static void cache_replacement(query_mana
|
*result = bottom->q_uuid; |
*result = bottom->q_uuid; |
bottom->q_uuid.bv_val = NULL; |
bottom->q_uuid.bv_val = NULL; |
|
|
Debug( LDAP_DEBUG_CACHE, "Lock CR index = %d\n", temp_id, 0, 0 ); |
Debug( pcache_debug, "Lock CR index = %d\n", temp_id, 0, 0 ); |
ldap_pvt_thread_rdwr_wlock(&(qm->templates[temp_id].t_rwlock)); |
ldap_pvt_thread_rdwr_wlock(&(qm->templates[temp_id].t_rwlock)); |
remove_from_template(bottom, (qm->templates+temp_id)); |
remove_from_template(bottom, (qm->templates+temp_id)); |
Debug( LDAP_DEBUG_CACHE, "TEMPLATE %d QUERIES-- %d\n", |
Debug( pcache_debug, "TEMPLATE %d QUERIES-- %d\n", |
temp_id, qm->templates[temp_id].no_of_queries, 0 ); |
temp_id, qm->templates[temp_id].no_of_queries, 0 ); |
Debug( LDAP_DEBUG_CACHE, "Unlock CR index = %d\n", temp_id, 0, 0 ); |
Debug( pcache_debug, "Unlock CR index = %d\n", temp_id, 0, 0 ); |
ldap_pvt_thread_rdwr_wunlock(&(qm->templates[temp_id].t_rwlock)); |
ldap_pvt_thread_rdwr_wunlock(&(qm->templates[temp_id].t_rwlock)); |
free_query(bottom); |
free_query(bottom); |
} |
} |
Line 814 remove_query_data (
|
Line 816 remove_query_data (
|
op->o_req_ndn = qi->xdn; |
op->o_req_ndn = qi->xdn; |
|
|
if ( qi->del) { |
if ( qi->del) { |
Debug( LDAP_DEBUG_CACHE, "DELETING ENTRY TEMPLATE=%s\n", |
Debug( pcache_debug, "DELETING ENTRY TEMPLATE=%s\n", |
query_uuid->bv_val, 0, 0 ); |
query_uuid->bv_val, 0, 0 ); |
|
|
op->o_tag = LDAP_REQ_DELETE; |
op->o_tag = LDAP_REQ_DELETE; |
Line 836 remove_query_data (
|
Line 838 remove_query_data (
|
mod.sml_values = vals; |
mod.sml_values = vals; |
mod.sml_nvalues = NULL; |
mod.sml_nvalues = NULL; |
mod.sml_next = NULL; |
mod.sml_next = NULL; |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"REMOVING TEMP ATTR : TEMPLATE=%s\n", |
"REMOVING TEMP ATTR : TEMPLATE=%s\n", |
query_uuid->bv_val, 0, 0 ); |
query_uuid->bv_val, 0, 0 ); |
|
|
Line 978 cache_entries(
|
Line 980 cache_entries(
|
op_tmp.o_dn = cm->db.be_rootdn; |
op_tmp.o_dn = cm->db.be_rootdn; |
op_tmp.o_ndn = cm->db.be_rootndn; |
op_tmp.o_ndn = cm->db.be_rootndn; |
|
|
Debug( LDAP_DEBUG_CACHE, "UUID for query being added = %s\n", |
Debug( pcache_debug, "UUID for query being added = %s\n", |
uuidbuf, 0, 0 ); |
uuidbuf, 0, 0 ); |
|
|
for ( e=si->head; e; e=si->head ) { |
for ( e=si->head; e; e=si->head ) { |
Line 987 cache_entries(
|
Line 989 cache_entries(
|
while ( cm->cur_entries > (cm->max_entries) ) { |
while ( cm->cur_entries > (cm->max_entries) ) { |
qm->crfunc(qm, &crp_uuid); |
qm->crfunc(qm, &crp_uuid); |
if (crp_uuid.bv_val) { |
if (crp_uuid.bv_val) { |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"Removing query UUID %s\n", |
"Removing query UUID %s\n", |
crp_uuid.bv_val, 0, 0 ); |
crp_uuid.bv_val, 0, 0 ); |
return_val = remove_query_data(&op_tmp, rs, &crp_uuid); |
return_val = remove_query_data(&op_tmp, rs, &crp_uuid); |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"QUERY REMOVED, SIZE=%d\n", |
"QUERY REMOVED, SIZE=%d\n", |
return_val, 0, 0); |
return_val, 0, 0); |
ldap_pvt_thread_mutex_lock( |
ldap_pvt_thread_mutex_lock( |
&cm->cache_mutex ); |
&cm->cache_mutex ); |
cm->cur_entries -= return_val; |
cm->cur_entries -= return_val; |
cm->num_cached_queries--; |
cm->num_cached_queries--; |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"STORED QUERIES = %lu\n", |
"STORED QUERIES = %lu\n", |
cm->num_cached_queries, 0, 0 ); |
cm->num_cached_queries, 0, 0 ); |
ldap_pvt_thread_mutex_unlock( |
ldap_pvt_thread_mutex_unlock( |
&cm->cache_mutex ); |
&cm->cache_mutex ); |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"QUERY REMOVED, CACHE =" |
"QUERY REMOVED, CACHE =" |
"%d entries\n", |
"%d entries\n", |
cm->cur_entries, 0, 0 ); |
cm->cur_entries, 0, 0 ); |
Line 1013 cache_entries(
|
Line 1015 cache_entries(
|
return_val = merge_entry(&op_tmp, e, query_uuid); |
return_val = merge_entry(&op_tmp, e, query_uuid); |
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
cm->cur_entries += return_val; |
cm->cur_entries += return_val; |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"ENTRY ADDED/MERGED, CACHED ENTRIES=%d\n", |
"ENTRY ADDED/MERGED, CACHED ENTRIES=%d\n", |
cm->cur_entries, 0, 0 ); |
cm->cur_entries, 0, 0 ); |
return_val = 0; |
return_val = 0; |
Line 1075 pcache_response(
|
Line 1077 pcache_response(
|
|
|
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
cm->num_cached_queries++; |
cm->num_cached_queries++; |
Debug( LDAP_DEBUG_CACHE, "STORED QUERIES = %lu\n", |
Debug( pcache_debug, "STORED QUERIES = %lu\n", |
cm->num_cached_queries, 0, 0 ); |
cm->num_cached_queries, 0, 0 ); |
ldap_pvt_thread_mutex_unlock(&cm->cache_mutex); |
ldap_pvt_thread_mutex_unlock(&cm->cache_mutex); |
|
|
Line 1178 pcache_chk_controls(
|
Line 1180 pcache_chk_controls(
|
/* fallthru */ |
/* fallthru */ |
|
|
case SLAP_CONTROL_CRITICAL: |
case SLAP_CONTROL_CRITICAL: |
Debug( LDAP_DEBUG_CACHE, "%s: " |
Debug( pcache_debug, "%s: " |
"%scritical pagedResults control " |
"%scritical pagedResults control " |
"disabled with proxy cache%s.\n", |
"disabled with proxy cache%s.\n", |
op->o_log_prefix, non, stripped ); |
op->o_log_prefix, non, stripped ); |
Line 1229 pcache_op_search(
|
Line 1231 pcache_op_search(
|
return SLAP_CB_CONTINUE; |
return SLAP_CB_CONTINUE; |
} |
} |
|
|
Debug( LDAP_DEBUG_CACHE, "query template of incoming query = %s\n", |
Debug( pcache_debug, "query template of incoming query = %s\n", |
tempstr.bv_val, 0, 0 ); |
tempstr.bv_val, 0, 0 ); |
|
|
/* FIXME: cannot cache/answer requests with pagedResults control */ |
/* FIXME: cannot cache/answer requests with pagedResults control */ |
Line 1274 pcache_op_search(
|
Line 1276 pcache_op_search(
|
BackendDB *save_bd = op->o_bd; |
BackendDB *save_bd = op->o_bd; |
slap_callback *save_cb = op->o_callback; |
slap_callback *save_cb = op->o_callback; |
|
|
Debug( LDAP_DEBUG_CACHE, "QUERY ANSWERABLE\n", 0, 0, 0 ); |
Debug( pcache_debug, "QUERY ANSWERABLE\n", 0, 0, 0 ); |
op->o_tmpfree( filter_attrs, op->o_tmpmemctx ); |
op->o_tmpfree( filter_attrs, op->o_tmpmemctx ); |
ldap_pvt_thread_rdwr_runlock(&qm->templates[i].t_rwlock); |
ldap_pvt_thread_rdwr_runlock(&qm->templates[i].t_rwlock); |
if ( BER_BVISNULL( &answerable->q_uuid )) { |
if ( BER_BVISNULL( &answerable->q_uuid )) { |
Line 1291 pcache_op_search(
|
Line 1293 pcache_op_search(
|
return i; |
return i; |
} |
} |
|
|
Debug( LDAP_DEBUG_CACHE, "QUERY NOT ANSWERABLE\n", 0, 0, 0 ); |
Debug( pcache_debug, "QUERY NOT ANSWERABLE\n", 0, 0, 0 ); |
|
|
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
if (cm->num_cached_queries >= cm->max_queries) { |
if (cm->num_cached_queries >= cm->max_queries) { |
Line 1306 pcache_op_search(
|
Line 1308 pcache_op_search(
|
slap_callback *cb; |
slap_callback *cb; |
struct search_info *si; |
struct search_info *si; |
|
|
Debug( LDAP_DEBUG_CACHE, "QUERY CACHEABLE\n", 0, 0, 0 ); |
Debug( pcache_debug, "QUERY CACHEABLE\n", 0, 0, 0 ); |
query.filter = filter_dup(op->ors_filter, NULL); |
query.filter = filter_dup(op->ors_filter, NULL); |
add_filter_attrs(op, &query.attrs, &qm->attr_sets[attr_set], |
add_filter_attrs(op, &query.attrs, &qm->attr_sets[attr_set], |
filter_attrs, fattr_cnt, fattr_got_oc); |
filter_attrs, fattr_cnt, fattr_got_oc); |
Line 1343 pcache_op_search(
|
Line 1345 pcache_op_search(
|
} |
} |
|
|
} else { |
} else { |
Debug( LDAP_DEBUG_CACHE, "QUERY NOT CACHEABLE\n", |
Debug( pcache_debug, "QUERY NOT CACHEABLE\n", |
0, 0, 0); |
0, 0, 0); |
} |
} |
|
|
Line 1423 consistency_check(
|
Line 1425 consistency_check(
|
if ( query ) pause = 0; |
if ( query ) pause = 0; |
op->o_time = slap_get_time(); |
op->o_time = slap_get_time(); |
while (query && (query->expiry_time < op->o_time)) { |
while (query && (query->expiry_time < op->o_time)) { |
Debug( LDAP_DEBUG_CACHE, "Lock CR index = %d\n", |
Debug( pcache_debug, "Lock CR index = %d\n", |
i, 0, 0 ); |
i, 0, 0 ); |
ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock); |
ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock); |
remove_from_template(query, templ); |
remove_from_template(query, templ); |
Debug( LDAP_DEBUG_CACHE, "TEMPLATE %d QUERIES-- %d\n", |
Debug( pcache_debug, "TEMPLATE %d QUERIES-- %d\n", |
i, templ->no_of_queries, 0 ); |
i, templ->no_of_queries, 0 ); |
Debug( LDAP_DEBUG_CACHE, "Unlock CR index = %d\n", |
Debug( pcache_debug, "Unlock CR index = %d\n", |
i, 0, 0 ); |
i, 0, 0 ); |
ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock); |
ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock); |
ldap_pvt_thread_mutex_lock(&qm->lru_mutex); |
ldap_pvt_thread_mutex_lock(&qm->lru_mutex); |
Line 1439 consistency_check(
|
Line 1441 consistency_check(
|
return_val = 0; |
return_val = 0; |
else |
else |
return_val = remove_query_data(op, &rs, &query->q_uuid); |
return_val = remove_query_data(op, &rs, &query->q_uuid); |
Debug( LDAP_DEBUG_CACHE, "STALE QUERY REMOVED, SIZE=%d\n", |
Debug( pcache_debug, "STALE QUERY REMOVED, SIZE=%d\n", |
return_val, 0, 0 ); |
return_val, 0, 0 ); |
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
ldap_pvt_thread_mutex_lock(&cm->cache_mutex); |
cm->cur_entries -= return_val; |
cm->cur_entries -= return_val; |
cm->num_cached_queries--; |
cm->num_cached_queries--; |
Debug( LDAP_DEBUG_CACHE, "STORED QUERIES = %lu\n", |
Debug( pcache_debug, "STORED QUERIES = %lu\n", |
cm->num_cached_queries, 0, 0 ); |
cm->num_cached_queries, 0, 0 ); |
ldap_pvt_thread_mutex_unlock(&cm->cache_mutex); |
ldap_pvt_thread_mutex_unlock(&cm->cache_mutex); |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"STALE QUERY REMOVED, CACHE =" |
"STALE QUERY REMOVED, CACHE =" |
"%d entries\n", |
"%d entries\n", |
cm->cur_entries, 0, 0 ); |
cm->cur_entries, 0, 0 ); |
Line 1729 pc_cf_gen( ConfigArgs *c )
|
Line 1731 pc_cf_gen( ConfigArgs *c )
|
return( 1 ); |
return( 1 ); |
} |
} |
cm->cc_period = (time_t)t; |
cm->cc_period = (time_t)t; |
Debug( LDAP_DEBUG_CACHE, |
Debug( pcache_debug, |
"Total # of attribute sets to be cached = %d.\n", |
"Total # of attribute sets to be cached = %d.\n", |
cm->numattrsets, 0, 0 ); |
cm->numattrsets, 0, 0 ); |
qm->attr_sets = ( struct attr_set * )ch_calloc( cm->numattrsets, |
qm->attr_sets = ( struct attr_set * )ch_calloc( cm->numattrsets, |
Line 1830 pc_cf_gen( ConfigArgs *c )
|
Line 1832 pc_cf_gen( ConfigArgs *c )
|
temp->no_of_queries = 0; |
temp->no_of_queries = 0; |
|
|
ber_str2bv( c->argv[1], 0, 1, &temp->querystr ); |
ber_str2bv( c->argv[1], 0, 1, &temp->querystr ); |
Debug( LDAP_DEBUG_CACHE, "Template:\n", 0, 0, 0 ); |
Debug( pcache_debug, "Template:\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_CACHE, " query template: %s\n", |
Debug( pcache_debug, " query template: %s\n", |
temp->querystr.bv_val, 0, 0 ); |
temp->querystr.bv_val, 0, 0 ); |
temp->attr_set_index = i; |
temp->attr_set_index = i; |
qm->attr_sets[i].flags |= PC_REFERENCED; |
qm->attr_sets[i].flags |= PC_REFERENCED; |
Debug( LDAP_DEBUG_CACHE, " attributes: \n", 0, 0, 0 ); |
Debug( pcache_debug, " attributes: \n", 0, 0, 0 ); |
if ( ( attrarray = qm->attr_sets[i].attrs ) != NULL ) { |
if ( ( attrarray = qm->attr_sets[i].attrs ) != NULL ) { |
for ( i=0; attrarray[i].an_name.bv_val; i++ ) |
for ( i=0; attrarray[i].an_name.bv_val; i++ ) |
Debug( LDAP_DEBUG_CACHE, "\t%s\n", |
Debug( pcache_debug, "\t%s\n", |
attrarray[i].an_name.bv_val, 0, 0 ); |
attrarray[i].an_name.bv_val, 0, 0 ); |
} |
} |
temp++; |
temp++; |
Line 2078 int pcache_initialize()
|
Line 2080 int pcache_initialize()
|
LDAPAttributeType *at; |
LDAPAttributeType *at; |
int code; |
int code; |
const char *err; |
const char *err; |
|
struct berval debugbv = BER_BVC("pcache"); |
|
|
|
if (( code = slap_loglevel_get( &debugbv, &pcache_debug ))) |
|
return code; |
|
|
at = ldap_str2attributetype( queryid_schema, &code, &err, |
at = ldap_str2attributetype( queryid_schema, &code, &err, |
LDAP_SCHEMA_ALLOW_ALL ); |
LDAP_SCHEMA_ALLOW_ALL ); |