ITS#9045 rlock only if there may be other threads

We can't rlock if we've registered ourselves as a writer. We can only
figure that out by checking if we're the thread that initiated the
pause: is the server paused already?
This commit is contained in:
Ondřej Kuzník 2023-01-23 11:48:33 +00:00
parent 5ccbe63246
commit 12bf5a95ba
3 changed files with 15 additions and 5 deletions

View file

@ -253,7 +253,8 @@ typedef enum {
LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX,
LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX,
LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX,
LDAP_PVT_THREAD_POOL_PARAM_STATE
LDAP_PVT_THREAD_POOL_PARAM_STATE,
LDAP_PVT_THREAD_POOL_PARAM_PAUSED
} ldap_pvt_thread_pool_param_t;
#endif /* !LDAP_PVT_THREAD_H_DONE */

View file

@ -769,6 +769,12 @@ ldap_pvt_thread_pool_query(
}
break;
case LDAP_PVT_THREAD_POOL_PARAM_PAUSED:
ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
count = (pool->ltp_pause == PAUSED);
ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
break;
case LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN:
break;
}

View file

@ -6900,13 +6900,16 @@ int config_back_entry_get(
CfBackInfo *cfb;
CfEntryInfo *ce, *last;
Entry *e = NULL;
int locked = 0, rc = LDAP_NO_SUCH_OBJECT;
int paused = 0, rc = LDAP_NO_SUCH_OBJECT;
cfb = (CfBackInfo *)op->o_bd->be_private;
if ( !ldap_pvt_thread_pool_pausequery( &connection_pool ) ) {
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 );
locked = 1;
}
ce = config_find_base( cfb->cb_root, ndn, &last );
if ( ce ) {
@ -6922,7 +6925,7 @@ int config_back_entry_get(
if ( e ) {
*ent = entry_dup( e );
}
if ( locked )
if ( !paused )
ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock );
return rc;