From ceb632b0c16be229d613342982a42ea4cd163ce2 Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@openldap.org>
Date: Fri, 4 Sep 2020 17:49:38 +0100
Subject: [PATCH] ITS#9338 Add backlog control for testing slapd write waits

---
 clients/tools/common.c     |  9 +++++++++
 clients/tools/common.h     |  3 +++
 clients/tools/ldapsearch.c | 16 ++++++++++++++++
 3 files changed, 28 insertions(+)

diff --git a/clients/tools/common.c b/clients/tools/common.c
index 2658fcd2bc..f77a1ea262 100644
--- a/clients/tools/common.c
+++ b/clients/tools/common.c
@@ -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;
 
diff --git a/clients/tools/common.h b/clients/tools/common.h
index 997e73df8e..9ac3c9388f 100644
--- a/clients/tools/common.h
+++ b/clients/tools/common.h
@@ -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;
 
diff --git a/clients/tools/ldapsearch.c b/clients/tools/ldapsearch.c
index 0b2c5e018d..05f1b327e4 100644
--- a/clients/tools/ldapsearch.c
+++ b/clients/tools/ldapsearch.c
@@ -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 )
-- 
GitLab