X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=tests%2Fprogs%2Fslapd-addel.c;h=c96cdccd3528ba2db1f464dff1fba86f36ea58ea;hb=6d6a4b7ddae7c38bfb231161a12410b925f60646;hp=78860f01f1d22c7ce84ce7e6cc1a59f027edfe28;hpb=4d29df5bd1fabcdc50975651c746365686b62b53;p=openldap diff --git a/tests/progs/slapd-addel.c b/tests/progs/slapd-addel.c index 78860f01f1..c96cdccd35 100644 --- a/tests/progs/slapd-addel.c +++ b/tests/progs/slapd-addel.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2003 The OpenLDAP Foundation. + * Copyright 1999-2005 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,13 +34,14 @@ #include #define LOOPS 100 +#define RETRIES 0 static char * get_add_entry( char *filename, LDAPMod ***mods ); static void do_addel( char *uri, char *host, int port, char *manager, char *passwd, - char *dn, LDAPMod **attrs, int maxloop ); + char *dn, LDAPMod **attrs, int maxloop, int maxretries ); static void usage( char *name ) @@ -54,48 +55,54 @@ int main( int argc, char **argv ) { int i; - char *host = "localhost"; + char *host = "localhost"; char *uri = NULL; - int port = -1; + int port = -1; char *manager = NULL; char *passwd = NULL; char *filename = NULL; char *entry = NULL; - int loops = LOOPS; - LDAPMod **attrs = NULL; + int loops = LOOPS; + int retries = RETRIES; + LDAPMod **attrs = NULL; - while ( (i = getopt( argc, argv, "H:h:p:D:w:f:l:" )) != EOF ) { + while ( (i = getopt( argc, argv, "H:h:p:D:w:f:l:r:" )) != EOF ) { switch( i ) { - case 'H': /* the server's URI */ - uri = strdup( optarg ); + case 'H': /* the server's URI */ + uri = strdup( optarg ); break; - case 'h': /* the servers host */ - host = strdup( optarg ); + + case 'h': /* the servers host */ + host = strdup( optarg ); break; - case 'p': /* the servers port */ - port = atoi( optarg ); - break; + case 'p': /* the servers port */ + port = atoi( optarg ); + break; - case 'D': /* the servers manager */ - manager = strdup( optarg ); + case 'D': /* the servers manager */ + manager = strdup( optarg ); break; - case 'w': /* the server managers password */ - passwd = strdup( optarg ); + case 'w': /* the server managers password */ + passwd = strdup( optarg ); break; - case 'f': /* file with entry search request */ - filename = strdup( optarg ); - break; + case 'f': /* file with entry search request */ + filename = strdup( optarg ); + break; - case 'l': /* the number of loops */ - loops = atoi( optarg ); - break; + case 'l': /* the number of loops */ + loops = atoi( optarg ); + break; - default: - usage( argv[0] ); - break; + case 'r': + retries = atoi( optarg ); + break; + + default: + usage( argv[0] ); + break; } } @@ -120,7 +127,8 @@ main( int argc, char **argv ) } - do_addel( uri, host, port, manager, passwd, entry, attrs, loops ); + do_addel( uri, host, port, manager, passwd, entry, attrs, + loops, retries ); exit( EXIT_SUCCESS ); } @@ -249,13 +257,16 @@ do_addel( char *passwd, char *entry, LDAPMod **attrs, - int maxloop + int maxloop, + int maxretries ) { LDAP *ld = NULL; - int i; + int i = 0, do_retry = maxretries; pid_t pid = getpid(); + int rc = LDAP_SUCCESS; +retry:; if ( uri ) { ldap_initialize( &ld, uri ); } else { @@ -272,40 +283,54 @@ do_addel( &version ); } - if ( ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE ) - != LDAP_SUCCESS ) { - ldap_perror( ld, "ldap_bind" ); - exit( EXIT_FAILURE ); + if ( do_retry == maxretries ) { + fprintf( stderr, "PID=%ld - Add/Delete(%d): entry=\"%s\".\n", + (long) pid, maxloop, entry ); } + rc = ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE ); + if ( rc != LDAP_SUCCESS ) { + ldap_perror( ld, "ldap_bind" ); + if ( rc == LDAP_BUSY && do_retry > 0 ) { + do_retry--; + goto retry; + } + exit( EXIT_FAILURE ); + } - fprintf( stderr, "PID=%ld - Add/Delete(%d): entry=\"%s\".\n", - (long) pid, maxloop, entry ); - - for ( i = 0; i < maxloop; i++ ) { + for ( ; i < maxloop; i++ ) { /* add the entry */ - if ( ldap_add_s( ld, entry, attrs ) != LDAP_SUCCESS ) { - + rc = ldap_add_s( ld, entry, attrs ); + if ( rc != LDAP_SUCCESS ) { ldap_perror( ld, "ldap_add" ); + if ( rc == LDAP_BUSY && do_retry > 0 ) { + do_retry--; + goto retry; + } break; } +#if 0 /* wait a second for the add to really complete */ + /* This masks some race conditions though. */ sleep( 1 ); +#endif /* now delete the entry again */ - if ( ldap_delete_s( ld, entry ) != LDAP_SUCCESS ) { - + rc = ldap_delete_s( ld, entry ); + if ( rc != LDAP_SUCCESS ) { ldap_perror( ld, "ldap_delete" ); + if ( rc == LDAP_BUSY && do_retry > 0 ) { + do_retry--; + goto retry; + } break; - } - } - fprintf( stderr, " PID=%ld - Add/Delete done.\n", (long) pid ); + fprintf( stderr, " PID=%ld - Add/Delete done (%d).\n", (long) pid, rc ); ldap_unbind( ld ); }