ldap/servers/plugins/syntaxes/nameoptuid.c | 3 +--
ldap/servers/slapd/attr.c | 6 +++++-
ldap/servers/slapd/attrlist.c | 6 ++++--
ldap/servers/slapd/entry.c | 6 +++---
ldap/servers/slapd/entrywsi.c | 6 ++++--
ldap/servers/slapd/slapi-private.h | 4 ++--
ldap/servers/slapd/utf8compare.c | 19 ++++++++++++++++---
ldap/servers/slapd/value.c | 3 ++-
ldap/servers/slapd/valueset.c | 4 ++--
9 files changed, 39 insertions(+), 18 deletions(-)
New commits:
commit c0151f78509c35250095da6e2785842337963008
Author: Noriko Hosoi <nhosoi(a)redhat.com>
Date: Wed Jul 11 17:37:02 2012 -0700
Trac Ticket #346 - Slow ldapmodify operation time for large
quantities of multi-valued attribute values
https://fedorahosted.org/389/ticket/346
Fix description:
1) Set SLAPI_ATTR_FLAG_NORMALIZED to a_flag for the already
normalized dn values. Then, let slapi_attr_value_find
pass the flag to plugin_call_syntax_filter_ava, where
dn normalization is skipped based on the knowledge.
2) To avoid the confusion, rename value_normalize_value and
valuearray_normalize_value to value_dn_normalize_value and
valuearray_dn_normalize_value, respectively.
3) In slapi_has8thBit, instead of checking the 8th bit one byte
by one byte, check 4 bytes at one time.
diff --git a/ldap/servers/plugins/syntaxes/nameoptuid.c
b/ldap/servers/plugins/syntaxes/nameoptuid.c
index e6341e1..af31db9 100644
--- a/ldap/servers/plugins/syntaxes/nameoptuid.c
+++ b/ldap/servers/plugins/syntaxes/nameoptuid.c
@@ -170,8 +170,7 @@ nameoptuid_filter_ava(
syntax |= SYNTAX_NORM_FILT;
}
}
- return( string_filter_ava( bvfilter, bvals, syntax,
- ftype, retVal ) );
+ return( string_filter_ava( bvfilter, bvals, syntax, ftype, retVal ) );
}
diff --git a/ldap/servers/slapd/attr.c b/ldap/servers/slapd/attr.c
index df31eb1..17a8f5c 100644
--- a/ldap/servers/slapd/attr.c
+++ b/ldap/servers/slapd/attr.c
@@ -411,7 +411,11 @@ slapi_attr_value_find( const Slapi_Attr *a, const struct berval *v )
ava.ava_type = a->a_type;
ava.ava_value = *v;
- ava.ava_private = NULL;
+ if (a->a_flags & SLAPI_ATTR_FLAG_NORMALIZED) {
+ ava.ava_private = &a->a_flags;
+ } else {
+ ava.ava_private = NULL;
+ }
return(plugin_call_syntax_filter_ava( a, LDAP_FILTER_EQUALITY, &ava ));
}
diff --git a/ldap/servers/slapd/attrlist.c b/ldap/servers/slapd/attrlist.c
index cdf9e6b..4ae5fcf 100644
--- a/ldap/servers/slapd/attrlist.c
+++ b/ldap/servers/slapd/attrlist.c
@@ -291,7 +291,8 @@ int attrlist_replace(Slapi_Attr **alist, const char *type, struct
berval **vals)
attrlist_find_or_create(alist, type, &a);
valuearray_init_bervalarray(vals, &values);
if (slapi_attr_is_dn_syntax_attr(*a)) {
- valuearray_normalize_value(values);
+ valuearray_dn_normalize_value(values);
+ (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
}
rc = attr_replace(*a, values);
}
@@ -317,7 +318,8 @@ int attrlist_replace_with_flags(Slapi_Attr **alist, const char *type,
struct ber
attrlist_find_or_create(alist, type, &a);
valuearray_init_bervalarray_with_flags(vals, &values, flags);
if (slapi_attr_is_dn_syntax_attr(*a)) {
- valuearray_normalize_value(values);
+ valuearray_dn_normalize_value(values);
+ (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
}
rc = attr_replace(*a, values);
}
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c
index c91dc9c..57b7d6e 100644
--- a/ldap/servers/slapd/entry.c
+++ b/ldap/servers/slapd/entry.c
@@ -2084,7 +2084,7 @@ slapi_entry_size(Slapi_Entry *e)
/*
* return a complete copy of entry pointed to by "e"
- * LPXXX: entry extensions are not duplicated
+ * entry extensions are duplicated, as well.
*/
Slapi_Entry *
slapi_entry_dup( const Slapi_Entry *e )
@@ -2155,7 +2155,6 @@ slapi_entry_dup( const Slapi_Entry *e )
aiep->ext_copy(e, ec);
}
-
ENTRY_DUMP(ec,"slapi_entry_dup");
return( ec );
}
@@ -3530,7 +3529,8 @@ slapi_entry_add_values_sv(Slapi_Entry *e,
Slapi_Attr **alist= &e->e_attrs;
attrlist_find_or_create(alist, type, &a);
if (slapi_attr_is_dn_syntax_attr(*a)) {
- valuearray_normalize_value(vals);
+ valuearray_dn_normalize_value(vals);
+ (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
}
rc= attr_add_valuearray(*a,vals,slapi_entry_get_dn_const(e));
}
diff --git a/ldap/servers/slapd/entrywsi.c b/ldap/servers/slapd/entrywsi.c
index ac3eea3..639baa2 100644
--- a/ldap/servers/slapd/entrywsi.c
+++ b/ldap/servers/slapd/entrywsi.c
@@ -441,7 +441,8 @@ entry_add_present_values_wsi(Slapi_Entry *e, const char *type, struct
berval **b
a->a_flags |= flags;
/* Check if the type of the to-be-added values has DN syntax or not. */
if (slapi_attr_is_dn_syntax_attr(a)) {
- valuearray_normalize_value(valuestoadd);
+ valuearray_dn_normalize_value(valuestoadd);
+ a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
}
if(urp)
{
@@ -562,7 +563,8 @@ entry_delete_present_values_wsi(Slapi_Entry *e, const char *type,
struct berval
/* Check if the type of the to-be-deleted values has DN syntax
* or not. */
if (slapi_attr_is_dn_syntax_attr(a)) {
- valuearray_normalize_value(valuestodelete);
+ valuearray_dn_normalize_value(valuestodelete);
+ a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
}
if(urp)
{
diff --git a/ldap/servers/slapd/slapi-private.h b/ldap/servers/slapd/slapi-private.h
index d6bd99a..68c2329 100644
--- a/ldap/servers/slapd/slapi-private.h
+++ b/ldap/servers/slapd/slapi-private.h
@@ -369,7 +369,7 @@ const CSN *value_get_csn( const Slapi_Value *value, CSNType t );
const CSNSet *value_get_csnset ( const Slapi_Value *value);
Slapi_Value *value_remove_csn( Slapi_Value *value, CSNType t);
int value_contains_csn( const Slapi_Value *value, CSN *csn);
-int value_normalize_value(Slapi_Value *value);
+int value_dn_normalize_value(Slapi_Value *value);
/* dn.c */
/* this functions should only be used for dns allocated on the stack */
@@ -835,7 +835,7 @@ void valuearray_add_value_fast(Slapi_Value ***vals, Slapi_Value
*addval, int nva
void valuearray_add_valuearray( Slapi_Value ***vals, Slapi_Value **addvals, PRUint32
flags );
void valuearray_add_valuearray_fast( Slapi_Value ***vals, Slapi_Value **addvals, int
nvals, int naddvals, int *maxvals, int exact, int passin );
int valuearray_find(const Slapi_Attr *a, Slapi_Value **va, const Slapi_Value *v);
-int valuearray_normalize_value(Slapi_Value **vals);
+int valuearray_dn_normalize_value(Slapi_Value **vals);
/*
* proxyauth.c
diff --git a/ldap/servers/slapd/utf8compare.c b/ldap/servers/slapd/utf8compare.c
index f595ed6..e336ccb 100644
--- a/ldap/servers/slapd/utf8compare.c
+++ b/ldap/servers/slapd/utf8compare.c
@@ -60,14 +60,27 @@ typedef struct sUpperLowerTbl {
int
slapi_has8thBit(unsigned char *s)
{
- unsigned char *p, *tail;
- tail = s + strlen((char *)s);
- for (p = s; p < tail; p++) {
+#define MY8THBITWIDTH 4 /* sizeof(PRUint32) */
+#define MY8THBITFILTER 0x80808080
+ unsigned char *p, *stail, *ltail;
+ PRUint32 *uip;
+ size_t len = strlen((const char *)s);
+ ltail = s + len;
+ stail = ltail - (len % MY8THBITWIDTH);
+ for (p = s; p < stail; p += MY8THBITWIDTH) {
+ uip = (PRUint32 *)p;
+ if (MY8THBITFILTER & *uip) {
+ return 1;
+ }
+ }
+ for (; p < ltail; p++) {
if (0x80 & *p) {
return 1;
}
}
return 0;
+#undef MY8THBITWIDTH
+#undef MY8THBITFILTER
}
/*
diff --git a/ldap/servers/slapd/value.c b/ldap/servers/slapd/value.c
index 0d2a29b..6d30f63 100644
--- a/ldap/servers/slapd/value.c
+++ b/ldap/servers/slapd/value.c
@@ -581,7 +581,7 @@ value_dump( const Slapi_Value *value, const char *text)
#endif
int
-value_normalize_value(Slapi_Value *value)
+value_dn_normalize_value(Slapi_Value *value)
{
Slapi_DN *sdn = NULL;
int rc = 0;
@@ -595,6 +595,7 @@ value_normalize_value(Slapi_Value *value)
value->bv.bv_val = slapi_ch_strdup(slapi_sdn_get_dn(sdn));
value->bv.bv_len = slapi_sdn_get_ndn_len(sdn);
slapi_sdn_free(&sdn);
+ slapi_value_set_flags(value, SLAPI_ATTR_FLAG_NORMALIZED);
} else {
rc = 1;
slapi_ch_free((void **)&sdn); /* free just Slapi_DN */
diff --git a/ldap/servers/slapd/valueset.c b/ldap/servers/slapd/valueset.c
index 0456ca0..6bc3ffa 100644
--- a/ldap/servers/slapd/valueset.c
+++ b/ldap/servers/slapd/valueset.c
@@ -1476,13 +1476,13 @@ valueset_update_csn_for_valuearray(Slapi_ValueSet *vs, const
Slapi_Attr *a, Slap
}
int
-valuearray_normalize_value(Slapi_Value **vals)
+valuearray_dn_normalize_value(Slapi_Value **vals)
{
int rc = 0;
Slapi_Value **vp = NULL;
for (vp = vals; vp && *vp; vp++) {
- rc |= value_normalize_value(*vp);
+ rc |= value_dn_normalize_value(*vp);
}
return rc;