[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#8875) [Patch] Performance problems in back-mdb with large DITs and many aliases
- To: openldap-its@OpenLDAP.org
- Subject: Re: (ITS#8875) [Patch] Performance problems in back-mdb with large DITs and many aliases
- From: hyc@symas.com
- Date: Mon, 15 Jul 2019 20:12:25 +0000
- Auto-submitted: auto-generated (OpenLDAP-ITS)
This is a multi-part message in MIME format.
--------------AED2FFEE73F73B1613190B64
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
hyc@symas.com wrote:
> The tool to generate the test LDIF is attached. It reads an LDIF containing 500,000 users on stdin, and outputs the same LDIF,
> with aliases interspersed, on stdout.
>
Slightly tweaked, creates the alias after the target entry. In case the server does referential integrity on loading.
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/
--------------AED2FFEE73F73B1613190B64
Content-Type: text/x-csrc;
name="mkalias.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="mkalias.c"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NUMUSERS 500000
#define NUMALIASES 30000
#define NUMSUBALIASES 435
#define SUFFIX "dc=example,dc=com"
static const char ou1[] = "\
dn: ou=alias1," SUFFIX "\n\
objectclass: top\n\
objectclass: organizationalUnit\n\
ou: alias1\n";
static const char ou2[] = "\
dn: ou=alias2," SUFFIX "\n\
objectclass: top\n\
objectclass: organizationalUnit\n\
ou: alias2\n";
int qcmp(const void *a, const void *b)
{
const int *i = a, *j = b;
return *i - *j;
}
int main() {
char line[1024], dn[1024], *ou;
int aliases[NUMALIASES];
int subaliases[NUMSUBALIASES];
int i;
int nusers=0, naliases=0, nsubaliases=0, showalias=0;
/* select a random subset of users to generate aliases */
srand(time(0L));
for (i=0; i<NUMALIASES; i++) {
aliases[i] = rand() % NUMUSERS;
}
uniq1:
qsort(aliases, NUMALIASES, sizeof(int), qcmp);
/* make sure they're unique */
for (i=1; i<NUMALIASES; i++) {
if (aliases[i-1] == aliases[i]) {
aliases[i] = rand() % NUMUSERS;
goto uniq1;
}
}
/* select a random susbset of aliases for the target subtree */
for (i=0; i<NUMSUBALIASES; i++) {
subaliases[i] = rand() % NUMALIASES;
}
uniq2:
qsort(subaliases, NUMSUBALIASES, sizeof(int), qcmp);
/* make sure they're unique */
for (i=1; i<NUMSUBALIASES; i++) {
if (subaliases[i-1] == subaliases[i]) {
subaliases[i] = rand() % NUMALIASES;
goto uniq2;
}
}
for (i=0; i<NUMSUBALIASES; i++) {
subaliases[i] = aliases[subaliases[i]];
}
/* read LDIF */
while (fgets(line, sizeof(line), stdin) != NULL) {
if (line[0] == '#')
continue;
if (!strncmp(line, "dn: ", 4)) {
/* we assume all users' DNs use uid for RDN */
if (!strncmp(line+4, "uid=", 4)) {
if (!nusers) {
puts(ou1);
puts(ou2);
}
if (showalias) {
printf("dn: uid=x.%d,ou=%s," SUFFIX "\n", nusers, ou);
puts("objectclass: alias");
puts("objectclass: extensibleObject");
printf("aliasedObjectName: %s\n", dn);
showalias = 0;
}
if (nusers == aliases[naliases] ||
nusers == subaliases[nsubaliases]) {
if (nusers == subaliases[nsubaliases]) {
ou = "alias2";
nsubaliases++;
} else {
ou = "alias1";
}
naliases++;
strcpy(dn, line+4);
showalias = 1;
}
nusers++;
}
}
fputs(line, stdout);
}
return 0;
}
--------------AED2FFEE73F73B1613190B64--