From: Ondřej Kuzník Date: Mon, 14 Apr 2025 16:51:06 +0000 (+0100) Subject: ITS#10327 Allow lockless config_back_search() during server pause X-Git-Tag: OPENLDAP_REL_ENG_2_5_20~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57bb2cc6b714f68f98182a67e0f2fbe89cc3936f;p=thirdparty%2Fopenldap.git ITS#10327 Allow lockless config_back_search() during server pause The assumption is that the only reason it is allowed to run at this point is that it is called from the reconfiguration context anyway. --- diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index 3d1d06d4b4..d7a4531316 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -6944,10 +6944,17 @@ config_back_search( Operation *op, SlapReply *rs ) CfBackInfo *cfb; CfEntryInfo *ce, *last = NULL; slap_mask_t mask; + int paused = 0; cfb = (CfBackInfo *)op->o_bd->be_private; - ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock ); + if ( ldap_pvt_thread_pool_query( &connection_pool, + LDAP_PVT_THREAD_POOL_PARAM_PAUSED, &paused ) ) { + return -1; + } + if ( !paused ) { + ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock ); + } ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last, op ); if ( !ce ) { if ( last ) @@ -6982,7 +6989,8 @@ config_back_search( Operation *op, SlapReply *rs ) } out: - ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock ); + if ( !paused ) + ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock ); send_ldap_result( op, rs ); return rs->sr_err; }