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-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ca5391b8111d45a88eb5d76ce030e4b1d0822591;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 886f120b04..7200e8c338 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -6994,10 +6994,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 ) @@ -7032,7 +7039,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; }