From d1131664754403017c97a662d74e7f17d3c205a1 Mon Sep 17 00:00:00 2001 From: Jong Hyuk Choi Date: Wed, 13 Aug 2003 23:44:56 +0000 Subject: [PATCH] Proxy cache patch (by Jong, Apurva, & Kurt) 1. Glueing patch for proxy cache 2. test script update to avoid schema checking voilations (attributes set) 3. configuration patch for proxy cache --- configure | 6 + configure.in | 6 + servers/slapd/back-meta/cache-merge.c | 366 +++++-------------------- servers/slapd/back-meta/cache-remove.c | 2 +- servers/slapd/back-meta/cache-search.c | 75 ++++- tests/Makefile.in | 7 +- tests/data/slapd-proxycache.conf | 4 +- tests/scripts/all | 8 +- tests/scripts/args.sh | 5 + tests/scripts/test019-proxycaching | 48 ++-- 10 files changed, 183 insertions(+), 344 deletions(-) diff --git a/configure b/configure index 0c8cd46f72..72be9c0a0c 100755 --- a/configure +++ b/configure @@ -2882,6 +2882,7 @@ BUILD_LDAP=no BUILD_LDBM=no BUILD_META=no BUILD_MONITOR=no +BUILD_CACHE=no BUILD_NULL=no BUILD_PASSWD=no BUILD_PERL=no @@ -23271,6 +23272,10 @@ EOF BUILD_SLAPD=yes BUILD_META=yes BUILD_REWRITE=yes + if test $ol_enable_ldbm = yes -o \ + $ol_enable_bdb = yes ; then + BUILD_CACHE=yes + fi if test "$ol_with_meta_module" != static ; then cat >> confdefs.h <<\EOF #define SLAPD_META_DYNAMIC 1 @@ -23740,6 +23745,7 @@ s%@BUILD_LDAP@%$BUILD_LDAP%g s%@BUILD_LDBM@%$BUILD_LDBM%g s%@BUILD_META@%$BUILD_META%g s%@BUILD_MONITOR@%$BUILD_MONITOR%g +s%@BUILD_CACHE@%$BUILD_CACHE%g s%@BUILD_NULL@%$BUILD_NULL%g s%@BUILD_PASSWD@%$BUILD_PASSWD%g s%@BUILD_PERL@%$BUILD_PERL%g diff --git a/configure.in b/configure.in index 65b476ec68..42868442ab 100644 --- a/configure.in +++ b/configure.in @@ -541,6 +541,7 @@ BUILD_LDAP=no BUILD_LDBM=no BUILD_META=no BUILD_MONITOR=no +BUILD_CACHE=no BUILD_NULL=no BUILD_PASSWD=no BUILD_PERL=no @@ -2663,6 +2664,10 @@ if test "$ol_enable_meta" != no ; then BUILD_SLAPD=yes BUILD_META=yes BUILD_REWRITE=yes + if test $ol_enable_ldbm = yes -o \ + $ol_enable_bdb = yes ; then + BUILD_CACHE=yes + fi if test "$ol_with_meta_module" != static ; then AC_DEFINE(SLAPD_META_DYNAMIC,1, [define to support dynamic LDAP Metadirectory backend]) @@ -2832,6 +2837,7 @@ AC_SUBST(BUILD_SLAPD) AC_SUBST(BUILD_LDBM) AC_SUBST(BUILD_META) AC_SUBST(BUILD_MONITOR) + AC_SUBST(BUILD_CACHE) AC_SUBST(BUILD_NULL) AC_SUBST(BUILD_PASSWD) AC_SUBST(BUILD_PERL) diff --git a/servers/slapd/back-meta/cache-merge.c b/servers/slapd/back-meta/cache-merge.c index 28fd72f4b4..c3e92ecc4b 100644 --- a/servers/slapd/back-meta/cache-merge.c +++ b/servers/slapd/back-meta/cache-merge.c @@ -38,30 +38,12 @@ static struct berval bv_queryid_any = BER_BVC( "(queryid=*)" ); -static int -merge_func ( - Operation *op, - SlapReply *rs -); - -static void -add_func ( - Operation *op, - SlapReply *rs -); - static Attribute* add_attribute(AttributeDescription *ad, Entry* e, BerVarray value_array ); -static int -get_size_func ( - Operation *op, - SlapReply *rs -); - static int null_response ( Operation *op, @@ -116,25 +98,6 @@ get_entry_size( return size; } -/* quick hack: call the right callback */ -static int -add_merge_func( Operation *op, SlapReply *rs ) -{ - switch ( rs->sr_type ) { - case REP_SEARCH: - merge_func( op, rs ); - break; - - case REP_RESULT: - add_func( op, rs ); - break; - - default: - assert( 0 ); - } - return 0; -} - int merge_entry( Operation *op, @@ -143,277 +106,101 @@ merge_entry( struct exception* result ) { struct entry_info info; - struct berval normdn; - struct berval prettydn; + int rc; + Modifications* modlist = NULL; + const char* text = NULL; + BerVarray value_array; + Attribute *uuid_attr, *attr; + Entry *e; SlapReply sreply = {REP_RESULT}; Operation op_tmp = *op; - slap_callback cb = { add_merge_func, NULL }; + slap_callback cb; - Filter* filter = str2filter( bv_queryid_any.bv_val ); sreply.sr_entry = NULL; sreply.sr_nentries = 0; - dnPrettyNormal(0, &rs->sr_entry->e_name, &prettydn, &normdn, - op->o_tmpmemctx); - - free(rs->sr_entry->e_name.bv_val); - rs->sr_entry->e_name = prettydn; - if (rs->sr_entry->e_nname.bv_val) free(rs->sr_entry->e_nname.bv_val); - rs->sr_entry->e_nname = normdn; - - info.entry = rs->sr_entry; - info.uuid = query_uuid; - info.size_init = 0; - info.size_final = 0; - info.added = 0; - info.glue_be = op->o_bd; - info.err = SUCCESS; - cb.sc_private = &info; - - op_tmp.o_tag = LDAP_REQ_SEARCH; - op_tmp.o_protocol = LDAP_VERSION3; - op_tmp.o_callback = &cb; - op_tmp.o_caching_on = 1; - op_tmp.o_time = slap_get_time(); - op_tmp.o_do_not_cache = 1; - - op_tmp.o_req_dn = rs->sr_entry->e_name; - op_tmp.o_req_ndn = rs->sr_entry->e_nname; - op_tmp.ors_scope = LDAP_SCOPE_BASE; - op_tmp.ors_deref = LDAP_DEREF_NEVER; - op_tmp.ors_slimit = 1; - op_tmp.ors_tlimit = 0; - op_tmp.ors_filter = filter; - op_tmp.ors_filterstr = bv_queryid_any; - op_tmp.ors_attrs = NULL; - op_tmp.ors_attrsonly = 0; - - op->o_bd->be_search( &op_tmp, &sreply ); - result->type = info.err; - if ( result->type == SUCCESS ) - result->rc = info.added; - else - result->rc = 0; - return ( info.size_final - info.size_init ); -} - -static int -merge_func ( - Operation *op, - SlapReply *rs -) -{ - Backend *be; - char *new_attr_name; - Attribute *a_new, *a; - int i = 0; - int rc = 0; - - int count; - struct timeval time; /* time */ - long timediff; /* time */ - struct entry_info *info = op->o_callback->sc_private; - Filter *filter = str2filter( bv_queryid_any.bv_val ); - Entry *entry = info->entry; - struct berval *uuid = info->uuid; - Modifications *modhead = NULL; - Modifications *mod; - Modifications **modtail = &modhead; - AttributeDescription *a_new_desc; - const char *text = NULL; - Operation op_tmp = *op; - SlapReply sreply = {REP_RESULT}; - SlapReply sreply1 = {REP_RESULT}; - - info->err = SUCCESS; - - be = select_backend(&entry->e_nname, 0, 0); - - info->size_init = get_entry_size(rs->sr_entry, 0, 0); - a_new = entry->e_attrs; - - while (a_new != NULL) { - a_new_desc = a_new->a_desc; - mod = (Modifications *) malloc( sizeof(Modifications) ); - mod->sml_op = LDAP_MOD_REPLACE; - ber_dupbv(&mod->sml_type, &a_new_desc->ad_cname); - - for ( count = 0; a_new->a_vals[count].bv_val; count++ ) - ; - - mod->sml_bvalues = (struct berval*) malloc( - (count+1) * sizeof( struct berval) ); - - mod->sml_nvalues = (struct berval*) malloc( - (count+1) * sizeof( struct berval) ); - - for ( i = 0; i < count; i++ ) { - ber_dupbv(mod->sml_bvalues+i, a_new->a_vals+i); - if ( a_new->a_desc->ad_type->sat_equality && - a_new->a_desc->ad_type->sat_equality->smr_normalize ) { - rc = a_new->a_desc->ad_type->sat_equality->smr_normalize( - 0, - a_new->a_desc->ad_type->sat_syntax, - a_new->a_desc->ad_type->sat_equality, - a_new->a_vals+i, mod->sml_nvalues+i, NULL ); - if (rc) { - info->err = MERGE_ERR; - return 0; - } - } - else { - ber_dupbv( mod->sml_nvalues+i, a_new->a_vals+i ); - } - } - - mod->sml_bvalues[count].bv_val = 0; - mod->sml_bvalues[count].bv_len = 0; - - mod->sml_nvalues[count].bv_val = 0; - mod->sml_nvalues[count].bv_len = 0; - - mod->sml_desc = NULL; - slap_bv2ad(&mod->sml_type, &mod->sml_desc, &text); - mod->sml_next =NULL; - *modtail = mod; - modtail = &mod->sml_next; - a_new = a_new->a_next; - } - - /* add query UUID to queryid attribute */ - mod = (Modifications *) ch_malloc( sizeof(Modifications) ); - mod->sml_op = LDAP_MOD_ADD; - mod->sml_desc = slap_schema.si_ad_queryid; - ber_dupbv(&mod->sml_type, &mod->sml_desc->ad_cname); - - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( mod->sml_bvalues, uuid ); - mod->sml_bvalues[1].bv_val = NULL; - mod->sml_bvalues[1].bv_len = 0; - - mod->sml_nvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( mod->sml_nvalues, uuid ); - mod->sml_nvalues[1].bv_val = NULL; - mod->sml_nvalues[1].bv_len = 0; - - *modtail = mod; - mod->sml_next = NULL; - - /* Apply changes */ - op_tmp.o_req_dn = entry->e_name; - op_tmp.o_req_ndn = entry->e_nname; - op_tmp.orm_modlist = modhead; - - op_tmp.o_callback->sc_response = null_response; - /* FIXME: &op_tmp ??? */ - if (be->be_modify(&op_tmp, &sreply ) != 0 ) { - /* FIXME: cleanup ? */ - info->err = MERGE_ERR; - goto cleanup; - } - - /* compute the size of the entry */ - op_tmp.o_callback->sc_response = get_size_func; - - op_tmp.ors_scope = LDAP_SCOPE_BASE; - op_tmp.ors_deref = LDAP_DEREF_NEVER; - op_tmp.ors_slimit = 1; - op_tmp.ors_tlimit = 0; - op_tmp.ors_filter = filter; - op_tmp.ors_filterstr = bv_queryid_any; - op_tmp.ors_attrs = NULL; - op_tmp.ors_attrsonly = 0; - - sreply1.sr_entry = NULL; - sreply1.sr_nentries = 0; - - if (be->be_search( &op_tmp, &sreply1 ) != 0) { - info->err = GET_SIZE_ERR; - } - -cleanup:; - if ( modhead != NULL) { - slap_mods_free( modhead ); - } - - return 0; -} - -static void -add_func ( - Operation *op, - SlapReply *rs -) -{ - struct entry_info *info = op->o_callback->sc_private; - Entry *entry = info->entry; - struct berval *uuid = info->uuid; - Backend *be; - BerVarray value_array; - Entry *e; - Attribute *a, *attr; - int i,j; - SlapReply sreply = {REP_RESULT}; - - struct timeval time; /* time */ - long timediff; /* time */ - - Operation op_tmp = *op; - - /* - * new entry, construct an entry with - * the projected attributes - */ - if (rs->sr_nentries) { - return; - } - - op_tmp.o_callback->sc_response = null_response; - be = select_backend(&entry->e_nname, 0, 0); - e = (Entry*)malloc(sizeof(Entry)); - - ber_dupbv(&e->e_name,&entry->e_name); - ber_dupbv(&e->e_nname,&entry->e_nname); + e = ( Entry * ) ch_calloc( 1, sizeof( Entry )); + dnPrettyNormal(0, &rs->sr_entry->e_name, &e->e_name, &e->e_nname, op->o_tmpmemctx); - e->e_private = 0; - e->e_attrs = 0; - e->e_bv.bv_val = 0; + e->e_private = NULL; + e->e_attrs = NULL; + e->e_bv.bv_val = NULL; /* add queryid attribute */ value_array = (struct berval *)malloc(2 * sizeof( struct berval) ); - ber_dupbv(value_array, uuid); + ber_dupbv(value_array, query_uuid); value_array[1].bv_val = NULL; value_array[1].bv_len = 0; - a = add_attribute(slap_schema.si_ad_queryid, - e, value_array); + uuid_attr = add_attribute(slap_schema.si_ad_queryid, e, value_array); /* append the attribute list from the fetched entry */ - a->a_next = entry->e_attrs; - entry->e_attrs = NULL; + uuid_attr->a_next = rs->sr_entry->e_attrs; + rs->sr_entry->e_attrs = NULL; for ( attr = e->e_attrs; attr; attr = attr->a_next ) { if ( normalize_values( attr ) ) { - info->err = MERGE_ERR; - return; + info.err = MERGE_ERR; + result->rc = info.err; + return 0; } } - info->size_final = get_entry_size( e, 0, NULL ); + info.entry = e; + info.uuid = query_uuid; + info.size_init = get_entry_size( rs->sr_entry, 0, 0 ); + info.size_final = 0; + info.added = 0; + info.glue_be = op->o_bd; + info.err = SUCCESS; + cb.sc_private = &info; + cb.sc_response = null_response; + + op_tmp.o_tag = LDAP_REQ_ADD; + op_tmp.o_protocol = LDAP_VERSION3; + op_tmp.o_callback = &cb; + op_tmp.o_caching_on = 0; + op_tmp.o_time = slap_get_time(); + op_tmp.o_do_not_cache = 1; - op_tmp.o_bd = be; op_tmp.ora_e = e; - - if ( be->be_add( &op_tmp, &sreply ) == 0 ) { - info->added = 1; - be_entry_release_w( &op_tmp, e ); + op_tmp.o_req_dn = e->e_name; + op_tmp.o_req_ndn = e->e_nname; + rc = op->o_bd->be_add( &op_tmp, &sreply ); + + if ( rc != LDAP_SUCCESS ) { + if ( rc == LDAP_ALREADY_EXISTS ) { + slap_entry2mods( e, &modlist, &text ); + op_tmp.o_tag = LDAP_REQ_MODIFY; + op_tmp.orm_modlist = modlist; + op_tmp.o_req_dn = e->e_name; + op_tmp.o_req_ndn = e->e_nname; + rc = op->o_bd->be_modify( &op_tmp, &sreply ); + result->rc = info.added; + } else if ( rc == LDAP_REFERRAL || + rc == LDAP_NO_SUCH_OBJECT ) { + slap_entry2mods( e, &modlist, &text ); + syncrepl_add_glue( NULL, NULL, &op_tmp, e, modlist, 0, NULL, NULL ); + result->rc = info.added; + } else { + result->rc = 0; + } + if ( modlist != NULL ) slap_mods_free( modlist ); } else { - info->err = MERGE_ERR; + info.size_init = 0; + result->rc = info.added; + be_entry_release_w( &op_tmp, e ); } + + if ( result->rc ) + info.size_final = get_entry_size( e, info.size_init, result ); + else + info.size_final = info.size_init; + + return ( info.size_final - info.size_init ); } - static Attribute* add_attribute(AttributeDescription *ad, @@ -444,25 +231,6 @@ add_attribute(AttributeDescription *ad, return new_attr; } -static int -get_size_func ( - Operation *op, - SlapReply *rs -) -{ - struct entry_info *info = op->o_callback->sc_private; - struct exception result; - - if ( rs->sr_type == REP_SEARCH ) { - result.type = info->err; - info->size_final = get_entry_size(rs->sr_entry, - info->size_init, &result); - } - - return 0; -} - - static int null_response ( Operation *op, diff --git a/servers/slapd/back-meta/cache-remove.c b/servers/slapd/back-meta/cache-remove.c index ce7781f3b0..a85e3b9346 100644 --- a/servers/slapd/back-meta/cache-remove.c +++ b/servers/slapd/back-meta/cache-remove.c @@ -80,7 +80,7 @@ remove_query_data ( op_tmp.o_callback = &cb; op_tmp.o_time = slap_get_time(); op_tmp.o_do_not_cache = 1; - op_tmp.o_caching_on = 1; + op_tmp.o_caching_on = 0; op_tmp.o_req_dn = op->o_bd->be_suffix[0]; op_tmp.o_req_ndn = op->o_bd->be_nsuffix[0]; diff --git a/servers/slapd/back-meta/cache-search.c b/servers/slapd/back-meta/cache-search.c index 97230dfc94..13c2f600a3 100644 --- a/servers/slapd/back-meta/cache-search.c +++ b/servers/slapd/back-meta/cache-search.c @@ -274,8 +274,8 @@ meta_back_cache_search( int num_entries = 0; int curr_limit; int fattr_cnt=0; + int oc_attr_absent = 1; - struct exception result[1]; Filter* filter = str2filter(op->ors_filterstr.bv_val); @@ -284,10 +284,12 @@ meta_back_cache_search( cb.sc_private = op->o_bd; if (op->ors_attrs) { - for ( count=0; op->ors_attrs[ count ].an_name.bv_val; count++ ) - ; - attrs = (AttributeName*)malloc( ( count + 1 ) * - sizeof(AttributeName)); + for ( count=0; op->ors_attrs[ count ].an_name.bv_val; count++ ) { + if ( op->ors_attrs[count].an_desc == slap_schema.si_ad_objectClass ) + oc_attr_absent = 0; + } + attrs = (AttributeName*)malloc( ( count + 1 + oc_attr_absent ) + *sizeof(AttributeName)); for ( count=0; op->ors_attrs[ count ].an_name.bv_val; count++ ) { ber_dupbv(&attrs[ count ].an_name, &op->ors_attrs[ count ].an_name); @@ -297,7 +299,6 @@ meta_back_cache_search( attrs[ count ].an_name.bv_len = 0; } - result->type = SUCCESS; result->rc = 0; ldap_pvt_thread_mutex_lock(&cm->cache_mutex); @@ -364,6 +365,15 @@ meta_back_cache_search( } } + if ( attrs && oc_attr_absent ) { + for ( count = 0; attrs[count].an_name.bv_val; count++) ; + attrs[ count ].an_name.bv_val = "objectClass"; + attrs[ count ].an_name.bv_len = strlen( "objectClass" ); + attrs[ count ].an_desc = slap_schema.si_ad_objectClass; + attrs[ count + 1 ].an_name.bv_val = NULL; + attrs[ count + 1 ].an_name.bv_len = 0; + } + if (answerable) { Operation op_tmp; @@ -394,7 +404,7 @@ meta_back_cache_search( op_tmp.o_req_dn = cachebase; op_tmp.o_req_ndn = ncachebase; - op_tmp.o_caching_on = 1; + op_tmp.o_caching_on = 0; op_tmp.o_callback = &cb; li->glue_be->be_search(&op_tmp, rs); @@ -614,7 +624,7 @@ meta_back_cache_search( */ msgid[ i ] = ldap_search( lsc->ld, mbase, realscope, mapped_filter, mapped_attrs, - op->ors_attrsonly ); + op->ors_attrsonly ); if ( msgid[ i ] == -1 ) { result->type = CONN_ERR; @@ -660,8 +670,7 @@ meta_back_cache_search( Debug( LDAP_DEBUG_ANY, "QUERY CACHEABLE\n", 0, 0, 0 ); #endif /* !NEW_LOGGING */ op_tmp.o_bd = li->glue_be; - uuid = cache_entries(&op_tmp, rs, entry_array, - cm, result); + uuid = cache_entries(&op_tmp, rs, entry_array, cm, result); #ifdef NEW_LOGGING LDAP_LOG( BACK_META, DETAIL1, "Added query %s UUID %s ENTRIES %d\n", @@ -681,6 +690,19 @@ meta_back_cache_search( goto Catch; filter = 0; attrs = 0; + + /* FIXME : launch do_syncrepl() threads around here + * + * entryUUID and entryCSN need also to be requested by : + */ + /* + msgid[ i ] = ldap_search( lsc->ld, mbase, realscope, + mapped_filter, mapped_attrs, op->ors_attrsonly ); + */ + /* Also, mbase, realscope, mapped_filter, mapped_attrs need + * be managed as arrays. Each element needs to be retained by this point. + */ + } else { #ifdef NEW_LOGGING LDAP_LOG( BACK_META, DETAIL1, @@ -824,11 +846,15 @@ meta_create_entry ( struct berval a, mapped; Entry* ent; BerElement ber = *e->lm_ber; - Attribute *attr, **attrp; - struct berval dummy = { 0, NULL }; - struct berval *bv, bdn; + Attribute *attr, *soc_attr, **attrp; + struct berval dummy = { 0, NULL }; + struct berval *bv, bdn; const char *text; - char* ename = NULL; + char* ename = NULL; + struct berval sc; + char* textbuf; + size_t textlen; + if ( ber_scanf( &ber, "{m{", &bdn ) == LBER_ERROR ) { result->type = CREATE_ENTRY_ERR; return NULL; @@ -930,9 +956,13 @@ meta_create_entry ( if ( ber_scanf( &ber, "[W]", &attr->a_vals ) == LBER_ERROR || attr->a_vals == NULL ) { attr->a_vals = &dummy; +#if 0 } else if ( attr->a_desc == slap_schema.si_ad_objectClass || attr->a_desc == slap_schema.si_ad_structuralObjectClass) { +#else + } else if ( attr->a_desc == slap_schema.si_ad_objectClass ) { +#endif int i, last; for ( last = 0; attr->a_vals[ last ].bv_val; ++last ) ; @@ -953,6 +983,22 @@ meta_create_entry ( ber_dupbv( bv, &mapped ); } } + + structural_class( attr->a_vals, &sc, NULL, &text, textbuf, textlen ); + soc_attr = (Attribute*) ch_malloc( sizeof( Attribute )); + soc_attr->a_desc = slap_schema.si_ad_structuralObjectClass; + soc_attr->a_vals = (BerVarray) ch_malloc( 2* sizeof( BerValue )); + ber_dupbv( &soc_attr->a_vals[0], &sc ); + soc_attr->a_vals[1].bv_len = 0; + soc_attr->a_vals[1].bv_val = NULL; + soc_attr->a_nvals = (BerVarray) ch_malloc( 2* sizeof( BerValue )); + ber_dupbv( &soc_attr->a_nvals[0], &sc ); + soc_attr->a_nvals[1].bv_len = 0; + soc_attr->a_nvals[1].bv_val = NULL; + + *attrp = soc_attr; + attrp = &soc_attr->a_next; + /* * It is necessary to try to rewrite attributes with * dn syntax because they might be used in ACLs as @@ -1004,6 +1050,7 @@ meta_create_entry ( *attrp = attr; attrp = &attr->a_next; } + return ent; } diff --git a/tests/Makefile.in b/tests/Makefile.in index 99654ecd5d..17eb1592ca 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -8,6 +8,7 @@ BUILD_BDB=@BUILD_BDB@ BUILD_HDB=@BUILD_HDB@ BUILD_LDBM=@BUILD_LDBM@ BUILD_MONITOR=@BUILD_MONITOR@ +BUILD_CACHE=@BUILD_CACHE@ test: tests tests: int-bdb @@ -26,7 +27,7 @@ test-bdb: FORCE @if test "$(BUILD_BDB)" != "no"; then \ echo "Initiating LDAP tests for BDB..." ; \ $(MKDIR) test-db test-repl || true; \ - $(srcdir)/scripts/all $(srcdir) bdb $(BUILD_BDB) $(BUILD_MONITOR) ; \ + $(srcdir)/scripts/all $(srcdir) bdb $(BUILD_BDB) $(BUILD_MONITOR) $(BUILD_CACHE) ; \ else \ echo "run configure with --enable-bdb" ; \ fi @@ -39,7 +40,7 @@ test-hdb: FORCE @if test "$(BUILD_HDB)" != "no" ; then \ echo "Initiating LDAP tests for HDB..." ; \ $(MKDIR) test-db test-repl || true; \ - $(srcdir)/scripts/all $(srcdir) hdb $(BUILD_HDB) $(BUILD_MONITOR) ; \ + $(srcdir)/scripts/all $(srcdir) hdb $(BUILD_HDB) $(BUILD_MONITOR) $(BUILD_CACHE) ; \ else \ echo "run configure with --enable-hdb" ; \ fi @@ -52,7 +53,7 @@ test-ldbm: FORCE @if test "$(BUILD_LDBM)" != "no"; then \ echo "Initiating LDAP tests for LDBM..." ; \ $(MKDIR) test-db test-repl || true; \ - $(srcdir)/scripts/all $(srcdir) ldbm $(BUILD_LDBM) $(BUILD_MONITOR); \ + $(srcdir)/scripts/all $(srcdir) ldbm $(BUILD_LDBM) $(BUILD_MONITOR) $(BUILD_CACHE); \ else \ echo "run configure with --enable-ldbm" ; \ fi diff --git a/tests/data/slapd-proxycache.conf b/tests/data/slapd-proxycache.conf index 3a106ca08c..b0dd36b7de 100644 --- a/tests/data/slapd-proxycache.conf +++ b/tests/data/slapd-proxycache.conf @@ -39,8 +39,8 @@ suffix "o=University of Michigan,c=US" uri ldap://127.0.0.1:9009/o=University%20of%20Michigan,c=US cacheparams 10000 15000 2 @ENTRY_LIMIT@ @CACHETTL@ -attrset 0 sn cn title -attrset 1 mail postaladdress telephonenumber +attrset 0 sn cn title uid +attrset 1 mail postaladdress telephonenumber cn uid addtemplate (|(cn=)(sn=)) 0 @CACHETTL@ addtemplate (sn=) 0 @CACHETTL@ addtemplate (uid=) 1 @CACHETTL@ diff --git a/tests/scripts/all b/tests/scripts/all index 1e4a4d1da2..b0b9a94f99 100755 --- a/tests/scripts/all +++ b/tests/scripts/all @@ -38,12 +38,18 @@ fi SHTOOL="$SRCDIR/../build/shtool" +if test $# -eq 0 ; then + PROXYCACHE=no +else + PROXYCACHE=$1; shift +fi + TB=`$SHTOOL echo -e "%B"` TN=`$SHTOOL echo -e "%b"` for CMD in $SRCDIR/scripts/test*; do echo ">>>>> Starting ${TB}`basename $CMD`${TN} ..." - $CMD $SRCDIR $BACKEND $BACKENDTYPE $MONITOR + $CMD $SRCDIR $BACKEND $BACKENDTYPE $MONITOR $PROXYCACHE RC=$? if test $RC -eq 0 ; then echo ">>>>> $CMD completed ${TB}OK${TN}." diff --git a/tests/scripts/args.sh b/tests/scripts/args.sh index e0c6d653d1..bef77b0666 100755 --- a/tests/scripts/args.sh +++ b/tests/scripts/args.sh @@ -15,6 +15,11 @@ if test $# -ge 1 ; then MONITORDB=$1; shift fi +PROXYCACHE=no +if test $# -ge 1 ; then + PROXYCACHE=$1; shift +fi + WAIT=0 if test $# -ge 1 ; then WAIT=1; shift diff --git a/tests/scripts/test019-proxycaching b/tests/scripts/test019-proxycaching index c2c43a7e4a..ca9a3004fe 100755 --- a/tests/scripts/test019-proxycaching +++ b/tests/scripts/test019-proxycaching @@ -11,10 +11,10 @@ fi . $SRCDIR/scripts/args.sh $* -if test "$BACKEND" != "ldbm"; then - echo "Test only valid for back-ldbm" +if test $PROXYCACHE = no; then + echo "Proxy caching requires back-meta AND (back-ldbm OR back-bdb)" exit 0 -fi +fi echo "running defines.sh" . $SRCDIR/scripts/defines.sh @@ -59,7 +59,7 @@ if test $WAIT != 0 ; then read foo fi -sleep 5 +sleep 10 echo "Using ldapadd to populate the master directory..." $LDAPADD -x -D "$MANAGERDN" -h $LOCALHOST -p $PORT -w $PASSWD < \ @@ -93,9 +93,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 2: filter:(|(cn=*Jon*)(sn=Jon*)) attrs:cn sn title" +echo "Query 2: filter:(|(cn=*Jon*)(sn=Jon*)) attrs:cn sn title uid" $LDAPSEARCH -x -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - '(|(cn=*Jon*)(sn=Jon*))' cn sn title >> $SLAVEOUT 2>&1 + '(|(cn=*Jon*)(sn=Jon*))' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -104,9 +104,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 3: filter:(sn=Smith*) attrs:cn sn title" +echo "Query 3: filter:(sn=Smith*) attrs:cn sn title uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'sn=Smith*' cn sn title >> $SLAVEOUT 2>&1 + 'sn=Smith*' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -115,9 +115,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 4: filter:(sn=Doe*) attrs:cn sn title" +echo "Query 4: filter:(sn=Doe*) attrs:cn sn title uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'sn=Doe' cn sn title >> $SLAVEOUT 2>&1 + 'sn=Doe' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -126,9 +126,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 5: filter:(uid=bjorn) attrs:mail postaladdress telephonenumber" +echo "Query 5: filter:(uid=bjorn) attrs:mail postaladdress telephonenumber cn uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'uid=bjorn' mail postaladdress telephonenumber >> $SLAVEOUT 2>&1 + 'uid=bjorn' mail postaladdress telephonenumber cn uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -137,9 +137,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 6: filter:(mail=*@example.com) cn sn title" +echo "Query 6: filter:(mail=*@example.com) cn sn title uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'mail=*@mail.alumni.example.com' cn sn title >> $SLAVEOUT 2>&1 + 'mail=*@mail.alumni.example.com' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -148,9 +148,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 7: filter:(mail=*) cn sn title" +echo "Query 7: filter:(mail=*) cn sn title uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'mail=*' cn sn title >> $SLAVEOUT 2>&1 + 'mail=*' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -182,9 +182,9 @@ else exit 1 fi -echo "Query 8: filter:(|(cn=*Jones)(sn=Jones)) attrs:cn sn title" +echo "Query 8: filter:(|(cn=*Jones)(sn=Jones)) attrs:cn sn title uid" $LDAPSEARCH -x -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - '(|(cn=*Jones)(sn=Jones))' cn sn title >> $SLAVEOUT 2>&1 + '(|(cn=*Jones)(sn=Jones))' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -193,9 +193,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 9: filter:(sn=Smith) attrs:cn sn title" +echo "Query 9: filter:(sn=Smith) attrs:cn sn title uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'sn=Smith' cn sn title >> $SLAVEOUT 2>&1 + 'sn=Smith' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -204,9 +204,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 10: filter:(uid=bjorn) attrs:mail postaladdress telephonenumber" +echo "Query 10: filter:(uid=bjorn) attrs:mail postaladdress telephonenumber cn uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'uid=bjorn' mail postaladdress telephonenumber >> $SLAVEOUT 2>&1 + 'uid=bjorn' mail postaladdress telephonenumber cn uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -215,9 +215,9 @@ if test $RC != 0 ; then fi sleep 3 -echo "Query 11: filter:(mail=*@example.com) cn sn title" +echo "Query 11: filter:(mail=*@example.com) cn sn title uid" $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $SLAVEPORT \ - 'mail=jaj@mail.alumni.example.com' cn sn title >> $SLAVEOUT 2>&1 + 'mail=jaj@mail.alumni.example.com' cn sn title uid >> $SLAVEOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" -- 2.39.5