]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9338 Add backlog control for testing slapd write waits
authorHoward Chu <hyc@openldap.org>
Fri, 4 Sep 2020 16:49:38 +0000 (17:49 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 4 Sep 2020 20:52:34 +0000 (20:52 +0000)
clients/tools/common.c
clients/tools/common.h
clients/tools/ldapsearch.c

index 2658fcd2bcbafa0e341bdc61fddb314a29f037c4..f77a1ea26255eb024bc2533580b5efc141c56ce7 100644 (file)
@@ -182,6 +182,8 @@ static struct tool_ctrls_t {
 enum { Intr_None = 0, Intr_Abandon, Intr_Cancel, Intr_Ignore }; 
 static volatile sig_atomic_t   gotintr, abcan;
 
+int backlog;
+
 
 #ifdef LDAP_CONTROL_X_SESSION_TRACKING
 static int
@@ -672,6 +674,13 @@ tool_args( int argc, char **argv )
                                        gotintr = abcan;
                                }
 
+                       } else if ( strcasecmp( control, "backlog" ) == 0 ) {
+                               /* special search: accumulate lots of responses
+                                * but don't read any, force slapd writer to wait.
+                                * Then abandon the search and issue a new one.
+                                */
+                               backlog = 1;
+
                        } else if ( tool_is_oid( control ) ) {
                                LDAPControl     *tmpctrls, ctrl;
 
index 997e73df8e7d5c6c392d84346447334c39118f5f..9ac3c9388f8c9d227c33687be065874930eabaee 100644 (file)
@@ -98,6 +98,9 @@ extern ber_int_t      vlvPos;
 extern ber_int_t       vlvCount;
 extern struct berval   *vlvContext;
 
+/* features */
+extern int             backlog;
+
 /* options */
 extern struct timeval  nettimeout;
 
index 0b2c5e018d8d1301373506e1a8c5f4d8d6a735d3..05f1b327e494da6006e0d3627fffb3c67dbe8bb3 100644 (file)
@@ -1420,6 +1420,7 @@ static int dosearch(
                tv_timelimitp = &tv_timelimit;
        }
 
+again:
        rc = ldap_search_ext( ld, base, scope, filter, attrs, attrsonly,
                sctrls, cctrls, tv_timelimitp, sizelimit, &msgid );
 
@@ -1443,6 +1444,21 @@ static int dosearch(
                tvp = &tv;
        }
 
+       if ( backlog == 1 ) {
+               printf( _("\nWaiting for responses to accumulate, press Enter to continue: "));
+               fflush( stdout );
+               getchar();
+               printf( _("Abandoning msgid %d\n"), msgid );
+               ldap_abandon_ext( ld, msgid, NULL, NULL );
+               /* turn off syncrepl control */
+               ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS, NULL );
+               backlog = 2;
+               scope = LDAP_SCOPE_BASE;
+               goto again;
+       } else if ( backlog == 2 ) {
+               tv.tv_sec = timelimit;
+       }
+
        while ((rc = ldap_result( ld, LDAP_RES_ANY,
                sortattr ? LDAP_MSG_ALL : LDAP_MSG_ONE,
                tvp, &res )) > 0 )