From 5e8a78fa6c9980927ee88ee88fd630378b8015b3 Mon Sep 17 00:00:00 2001 From: Howard Chu 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 9501399f61..e1edd0e34d 100644 --- a/clients/tools/common.c +++ b/clients/tools/common.c @@ -210,6 +210,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 @@ -704,6 +706,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 a7c18d1be3..aff5d1f042 100644 --- a/clients/tools/common.h +++ b/clients/tools/common.h @@ -99,6 +99,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 b8a1f661db..55bf26432d 100644 --- a/clients/tools/ldapsearch.c +++ b/clients/tools/ldapsearch.c @@ -1742,6 +1742,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 ); @@ -1765,6 +1766,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 )