]> 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:18 +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 1f1252d5dbb37bae73c73c3b790c8dc9b59c02e3..3ae22a58d0262dd74ec2aa961b7bf2f6fca783b4 100644 (file)
@@ -6952,10 +6952,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 )
@@ -6990,7 +6997,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;
 }