]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#10327 Allow lockless config_back_search() during server pause
authorOndřej Kuzník <ondra@mistotebe.net>
Mon, 14 Apr 2025 16:51:06 +0000 (17:51 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 6 May 2025 15:50:27 +0000 (15:50 +0000)
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.

servers/slapd/bconfig.c

index 3d1d06d4b47c4810bc961ddbacc31e28b5e8ba21..d7a4531316983ceb89758f001b2879c9c886c5fc 100644 (file)
@@ -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;
 }