]> git.sur5r.net Git - openldap/blobdiff - tests/progs/slapd-modify.c
allow a friendly behavior of write stress testers...
[openldap] / tests / progs / slapd-modify.c
index 37e45ec19e339ff26a0639697877782caa0f8f60..03ac37549d2832d27cf00f126f59a86639888d1a 100644 (file)
 static void
 do_modify( char *uri, char *host, int port, char *manager, char *passwd,
                char *entry, char *attr, char *value, int maxloop,
-               int maxretries );
+               int maxretries, int delay, int friendly );
 
 
 static void
 usage( char *name )
 {
-       fprintf( stderr, "usage: %s [-h <host>] -p port -D <managerDN> -w <passwd> -e <entry> [-l <loops>]\n",
+        fprintf( stderr,
+               "usage: %s "
+               "-H <uri> | ([-h <host>] -p <port>) "
+               "-D <manager> "
+               "-w <passwd> "
+               "-e <entry> "
+               "[-l <loops>] "
+               "[-r <maxretries>] "
+               "[-t <delay>]\n",
                        name );
        exit( EXIT_FAILURE );
 }
@@ -60,9 +68,15 @@ main( int argc, char **argv )
        char            *value = NULL;
        int             loops = LOOPS;
        int             retries = RETRIES;
+       int             delay = 0;
+       int             friendly = 0;
 
-       while ( (i = getopt( argc, argv, "H:h:p:D:w:e:a:l:r:" )) != EOF ) {
+       while ( (i = getopt( argc, argv, "FH:h:p:D:w:e:a:l:r:t:" )) != EOF ) {
                switch( i ) {
+               case 'F':
+                       friendly++;
+                       break;
+
                case 'H':               /* the server uri */
                        uri = strdup( optarg );
                        break;
@@ -95,10 +109,14 @@ main( int argc, char **argv )
                        loops = atoi( optarg );
                        break;
 
-               case 'r':
+               case 'r':               /* number of retries */
                        retries = atoi( optarg );
                        break;
 
+               case 't':               /* delay in seconds */
+                       delay = atoi( optarg );
+                       break;
+
                default:
                        usage( argv[0] );
                        break;
@@ -131,7 +149,7 @@ main( int argc, char **argv )
                value++;
 
        do_modify( uri, host, port, manager, passwd, entry, ava, value,
-                       loops, retries );
+                       loops, retries, delay, friendly );
        exit( EXIT_SUCCESS );
 }
 
@@ -139,7 +157,7 @@ main( int argc, char **argv )
 static void
 do_modify( char *uri, char *host, int port, char *manager,
        char *passwd, char *entry, char* attr, char* value,
-       int maxloop, int maxretries )
+       int maxloop, int maxretries, int delay, int friendly )
 {
        LDAP    *ld = NULL;
        int     i = 0, do_retry = maxretries;
@@ -185,9 +203,19 @@ retry:;
        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;
+               switch ( rc ) {
+               case LDAP_BUSY:
+               case LDAP_UNAVAILABLE:
+                       if ( do_retry > 0 ) {
+                               do_retry--;
+                               if ( delay > 0 ) {
+                                   sleep( delay );
+                               }
+                               goto retry;
+                       }
+               /* fallthru */
+               default:
+                       break;
                }
                exit( EXIT_FAILURE );
        }
@@ -197,28 +225,59 @@ retry:;
                rc = ldap_modify_s( ld, entry, mods );
                if ( rc != LDAP_SUCCESS ) {
                        ldap_perror( ld, "ldap_modify" );
-                       if ( rc == LDAP_BUSY && do_retry > 0 ) {
-                               do_retry--;
-                               goto retry;
+                       switch ( rc ) {
+                       case LDAP_TYPE_OR_VALUE_EXISTS:
+                               /* NOTE: this likely means
+                                * the second modify failed
+                                * during the previous round... */
+                               if ( !friendly ) {
+                                       goto done;
+                               }
+                               break;
+
+                       case LDAP_BUSY:
+                       case LDAP_UNAVAILABLE:
+                               if ( do_retry > 0 ) {
+                                       do_retry--;
+                                       goto retry;
+                               }
+                               /* fall thru */
+
+                       default:
+                               goto done;
                        }
-                       if ( rc != LDAP_NO_SUCH_OBJECT ) break;
-                       continue;
                }
                
                mod.mod_op = LDAP_MOD_DELETE;
                rc = ldap_modify_s( ld, entry, mods );
                if ( rc != LDAP_SUCCESS ) {
                        ldap_perror( ld, "ldap_modify" );
-                       if ( rc == LDAP_BUSY && do_retry > 0 ) {
-                               do_retry--;
-                               goto retry;
+                       switch ( rc ) {
+                       case LDAP_NO_SUCH_ATTRIBUTE:
+                               /* NOTE: this likely means
+                                * the first modify failed
+                                * during the previous round... */
+                               if ( !friendly ) {
+                                       goto done;
+                               }
+                               break;
+
+                       case LDAP_BUSY:
+                       case LDAP_UNAVAILABLE:
+                               if ( do_retry > 0 ) {
+                                       do_retry--;
+                                       goto retry;
+                               }
+                               /* fall thru */
+
+                       default:
+                               goto done;
                        }
-                       if ( rc != LDAP_NO_SUCH_OBJECT ) break;
-                       continue;
                }
 
        }
 
+done:;
        fprintf( stderr, " PID=%ld - Modify done (%d).\n", (long) pid, rc );
 
        ldap_unbind( ld );