openldap/servers/slapd
Dmitry Kovalev 2f4d324f60 A big bunch of improvements, contributed by Sam Drake and Raj Damani.
Summary of changes is cited below.
The patch still needs some cosmetic changes to be made, but is ready for testing.

-----Original Message-----
From: Sam Drake [mailto:drake@timesten.com]
Sent: Saturday, April 07, 2001 10:40 PM
To: 'mitya@seismic.ru'
Cc: openldap-devel@OpenLDAP.org
Subject: RE: Slapd frontend performance issues


FYI, here is a short description of the changes I made.  I'll package up the
changes asap, but it may take a couple of days.

The performance numbers quoted in this report were seen at my location with
a 100,000 object database ... the slower numbers I mentioned earlier were
reported by a customer with a 1,000,000 object database.

I also can't explain the very poor performance I saw with OpenLDAP and LDBM
with a 100,000 object database.

...Sam Drake / TimesTen Performance Software

----------

Work Performed

OpenLDAP 2.0.9, including back-sql, was built successfully on Solaris
8 using gcc.  The LDAP server itself, slapd, passed all tests bundled
with OpenLDAP.  OpenLDAP was built using Sleepycat LDBM release 3.1.17
as the "native" storage manager.

The experimental back-sql facility in slapd was also built
successfully.  It was built using Oracle release 8.1.7 and the Oracle
ODBC driver and ODBC Driver Manager from Merant.  Rudimentary testing
was performed with the data and examples provided with back-sql, and
back-sql was found to be functional.

Slapd and back-sql were then tested with TimesTen, using TimesTen
4.1.1.  Back-sql was not immediately functional with TimesTen due to a
number of SQL limitations in the TimesTen product.

Functional issues encountered were:

1. Back-sql issued SELECT statements including the construct,
   "UPPER(?)".  While TimesTen supports UPPER, it does not support the
   use of parameters as input to builtin functions.  Back-sql was
   modified to convert the parameter to upper case prior to giving it
   to the underlying database ... a change that is appropriate for all
   databases.

2. Back-sql issued SELECT statements using the SQL CONCAT function.
   TimesTen does not support this function.  Back-sql was modified to
   concatentate the necessary strings itself (in "C" code) prior to
   passing the parameters to SQL.  This change is also appropriate for
   all databases, not just TimesTen.

Once these two issues were resolved, back-sql could successfully
process LDAP searches using the sample data and examples provided with
back-sql.

While performance was not measured at this point, numerous serious
performance problems were observed with the back-sql code and the
generated SQL.  In particular:

1. In the process of implementing an LDAP search, back-sql will
   generate and execute a SQL query for all object classes stored in
   back-sql.  During the source of generating each SQL query, it is
   common for back-sql to determine that a particular object class can
   not possibly have any members satisfying the search.  For example,
   this can occur if the query searches an attribute of the LDAP
   object that does not exist in the SQL schema.  In this case,
   back-sql would generate and issue the SQL query anyway, including a
   clause such as "WHERE 1=0" in the generated SELECT.  The overhead
   of parsing, optimizing and executing the query is non-trivial, and
   the answer (the empty set) is known in advance. Solution: Back-sql
   was modified to stop executing a SQL query when it can be
   predetermined that the query will return no rows.

2. Searches in LDAP are fundamentally case-insensitive ("abc" is equal
   to "aBc").  However, in SQL this is not normally the case.
   Back-sql thus generated SQL SELECT statements including clauses of
   the form, "WHERE UPPER(attribute) = 'JOE'".  Even if an index is
   defined on the attribute in the relational database, the index can
   not be used to satisfy the query, as the index is case sensitive.
   The relational database then is forced to scan all rows in the
   table in order to satisfy the query ... an expensive and
   non-scalable proposition.  Solution: Back-sql was modified to allow
   the schema designer to add additional "upper cased" columns to the
   SQL schema.  These columns, if present, contain an upper cased
   version of the "standard" field, and will be used preferentially
   for searching.  Such columns can be provided for all searchable
   columns, some columns, or no columns.  An application using
   database "triggers" or similar mechanisms can automatically
   maintain these upper cased columns when the standard column is
   changed.

3. In order to implement the hierarchical nature of LDAP object
   hierarchies, OpenLDAP uses suffix searches in SQL.  For example, to
   find all objects in the subtree "o=TimesTen,c=us", a SQL SELECT
   statement of the form, "WHERE UPPER(dn) LIKE '%O=TIMESTEN,C=US'"
   would be employed.  Aside from the UPPER issue discussed above, a
   second performance problem in this query is the use of suffix
   search.  In TimesTen (and most relational databases), indexes can
   be used to optimize exact-match searches and prefix searches.
   However, suffix searches must be performed by scanning every row in
   the table ... an expensive and non-scalable proposition.  Solution:
   Back-sql was modified to optionally add a new "dn_ru" column to the
   ldap_entries table.  This additional column, if present, contains a
   byte-reversed and upper cased version of the DN.  This allows
   back-sql to generate indexable prefix searches.  This column is
   also easily maintained automatically through the use of triggers.

Results

A simple database schema was generated holding the LDAP objects and
attributes specified by our customer.  An application was written to
generate test databases.  Both TimesTen and Oracle 8.1.7 were
populated with 100,000 entry databases.

Load Times

Using "slapadd" followed by "slapindex", loading and indexing 100,000
entries in an LDBM database ran for 19 minutes 10 seconds.

Using a C++ application that used ODBC, loading 100,000 entries into
a disk based RDBMS took 17 minutes 53 seconds.

Using a C++ application that used ODBC, loading 100,000 entries into
TimesTen took 1 minute 40 seconds.

Search Times

The command, "timex timesearch.sh '(cn=fname210100*)'" was used to
test search times.  This command issues the same LDAP search 4000
times over a single LDAP connection.  Both the client and server
(slapd) were run on the same machine.

With TimesTen as the database, 4000 queries took 14.93 seconds, for a
rate of 267.9 per second.

With a disk based RDBMS as the database, 4000 queries took 77.79 seconds,
for a
rate of 51.42 per second.

With LDBM as the database, 1 query takes 76 seconds, or 0.076 per
second.  Something is clearly broken.
2001-08-02 17:28:59 +00:00
..
back-bdb Fix typo 2001-07-31 07:53:21 +00:00
back-dnssrv Add DNS SRV to error text 2001-01-24 17:25:30 +00:00
back-ldap Remove global_backendsyncfreq code (code has been pushed down into back-ldbm). 2001-06-28 18:02:46 +00:00
back-ldbm add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
back-meta Remove global_backendsyncfreq code (code has been pushed down into back-ldbm). 2001-06-28 18:02:46 +00:00
back-monitor This is the skeleton of back-monitor, the slapd monitoring backend. 2001-07-14 17:34:24 +00:00
back-passwd Remove global_backendsyncfreq code (code has been pushed down into back-ldbm). 2001-06-28 18:02:46 +00:00
back-perl Update SASL code to reuse context through life of session. 2000-07-13 22:54:38 +00:00
back-shell Remove global_backendsyncfreq code (code has been pushed down into back-ldbm). 2001-06-28 18:02:46 +00:00
back-sql A big bunch of improvements, contributed by Sam Drake and Raj Damani. 2001-08-02 17:28:59 +00:00
back-tcl New backend routine: back_attribute 2000-06-21 17:41:49 +00:00
schema This is the skeleton of back-monitor, the slapd monitoring backend. 2001-07-14 17:34:24 +00:00
shell-backends Y2k copyright update 2000-05-13 02:47:56 +00:00
tools add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
abandon.c fix format 2001-01-17 16:35:53 +00:00
acl.c Default ACL clause should be "by * none stop" not "by * stop". 2001-06-01 20:09:03 +00:00
aclparse.c Add name and uid support to dnaddr 2001-03-15 04:48:29 +00:00
ad.c Fix ;binary subtyping 2000-09-14 06:07:23 +00:00
add.c Add better modlist2mod error reporting (to client) 2001-05-10 03:41:17 +00:00
at.c Check schema NAMEs 2001-06-07 22:47:02 +00:00
attr.c Minor adjustments to last commit 2000-06-15 22:53:18 +00:00
ava.c fix format 2001-01-17 16:35:53 +00:00
backend.c add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
bind.c Add support for separate max incoming for anonymous and authenticated 2001-05-29 20:00:55 +00:00
ch_malloc.c fix format 2001-01-17 16:35:53 +00:00
charray.c added misc charray utilities 2001-07-06 12:20:26 +00:00
compare.c Fix root dse checks 2001-07-06 02:14:47 +00:00
config.c add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
configinfo.c Const'ification 2000-05-22 03:46:57 +00:00
connection.c Another round of TLS updates to support secure referral chasing 2001-06-25 19:17:42 +00:00
controls.c Fix disconnect bug 2001-05-06 20:01:18 +00:00
daemon.c Remove global_backendsyncfreq code (code has been pushed down into back-ldbm). 2001-06-28 18:02:46 +00:00
delete.c Fix root dse checks 2001-07-06 02:14:47 +00:00
dn.c Zap old DN code 2001-07-21 23:45:04 +00:00
entry.c Clean up entry_free() 2001-05-04 01:02:36 +00:00
extended.c fix format 2001-01-17 16:35:53 +00:00
filter.c plug substrings filter memory leak 2001-06-22 18:09:19 +00:00
filterentry.c Add comments to three-value logic 2001-06-23 02:42:39 +00:00
index.c First cut of LDBM substrings indexing. Needs testing. 2000-08-22 21:26:25 +00:00
init.c fix format 2001-01-17 16:35:53 +00:00
kerberos.c s/SAFEMEMCPY/AC_MEMCPY/ 2000-07-28 01:07:07 +00:00
libslapd.dsp Make some additional UTF8 public 2001-07-21 23:13:04 +00:00
limits.c add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
lock.c fix format 2001-01-17 16:35:53 +00:00
main.c Add some addl. logging 2001-08-02 03:37:20 +00:00
Makefile.in handle regex-based per op_ndn time/size limits 2001-07-28 11:24:22 +00:00
modify.c Add an improved single value constraint check. 2001-07-24 03:25:17 +00:00
modrdn.c Fix root dse checks 2001-07-06 02:14:47 +00:00
mods.c moved some slap_mods_* functions into mods.c, so mods.o can be included 2001-07-07 09:13:05 +00:00
module.c fix format 2001-01-17 16:35:53 +00:00
mr.c fix format 2001-01-17 16:35:53 +00:00
mra.c fix format 2001-01-17 16:35:53 +00:00
nt_svc.c Fixed bug (my own, rather old too) that causes a crash on exit when ru 2001-03-11 05:13:57 +00:00
oc.c Check schema NAMEs 2001-06-07 22:47:02 +00:00
operation.c fix format 2001-01-17 16:35:53 +00:00
passwd.c Use SMD5 is SHA1 is not available 2001-05-02 19:46:30 +00:00
phonetic.c s/METAPHONE/SLAPD_METAPHONE/ 2000-07-27 00:14:39 +00:00
proto-slap.h add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
repl.c Added the suffix=<dn> parameter to replica config directive 2001-07-21 14:15:23 +00:00
result.c fix format 2001-01-17 16:35:53 +00:00
root_dse.c Don't publish version 2 if disallowed 2000-08-31 18:51:15 +00:00
sasl.c fix logging macros (thanks Mei) 2001-02-02 13:49:26 +00:00
saslauthz.c fix debug line (ITS 1145) 2001-05-11 20:19:16 +00:00
schema_check.c Rework single-value check 2001-07-24 04:31:01 +00:00
schema_init.c Removed duplicate code by replacing case-Exact/Ignore-Filter/Indexer and 2001-07-27 22:54:43 +00:00
schema_prep.c fix format 2001-01-17 16:35:53 +00:00
schema.c unifdef -DSLAPD_SCHEMA_NOT_COMPAT -USLAPD_SCHEMA_COMPAT 2000-06-06 19:43:18 +00:00
schemaparse.c Check schema NAMEs 2001-06-07 22:47:02 +00:00
search.c This is the skeleton of back-monitor, the slapd monitoring backend. 2001-07-14 17:34:24 +00:00
sets.c Remove extranous characters (^M) and other minor clean up 2000-09-12 21:43:42 +00:00
sets.h Add support for Set ACLs and ACIs. Still need to make this syntax awa 2000-06-29 22:02:15 +00:00
slap.h add global, per backend and per op_ndn time/size soft, hard and to-be-checked limits (exploited by back-ldbm); see slapd.conf(5) for details 2001-08-01 10:09:04 +00:00
slapd.conf fix typo in comment 2001-04-21 01:32:03 +00:00
slapd.dsp Misc updates for NT4 2001-06-15 04:16:55 +00:00
starttls.c move TLS ctx to lconn struct in prep for supporting TLS with referrals 2001-06-25 07:33:42 +00:00
str2filter.c fix format 2001-01-17 16:35:53 +00:00
suffixalias.c fix format 2001-01-17 16:35:53 +00:00
syntax.c fix format 2001-01-17 16:35:53 +00:00
unbind.c fix format 2001-01-17 16:35:53 +00:00
user.c fix format 2001-01-17 16:35:53 +00:00
value.c Plug memory leak of normalized value in value_find() 2000-07-20 23:56:12 +00:00