Commit 23edc84b authored by Howard Chu's avatar Howard Chu Committed by Quanah Gibson-Mount
Browse files

ITS#8486 Don't keep sl_mutex locked when playing the sessionlog

parent c73f5b78
......@@ -130,6 +130,7 @@ typedef struct sessionlog {
int sl_numcsns;
int sl_num;
int sl_size;
int sl_playing;
slog_entry *sl_head;
slog_entry *sl_tail;
ldap_pvt_thread_mutex_t sl_mutex;
......@@ -1540,12 +1541,15 @@ syncprov_add_slog( Operation *op )
* wipe out anything in the log if we see them.
*/
ldap_pvt_thread_mutex_lock( &sl->sl_mutex );
/* can only do this if no one else is reading the log at the moment */
if (!sl->sl_playing) {
while ( se = sl->sl_head ) {
sl->sl_head = se->se_next;
ch_free( se );
}
sl->sl_tail = NULL;
sl->sl_num = 0;
}
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
return;
}
......@@ -1596,6 +1600,7 @@ syncprov_add_slog( Operation *op )
}
}
sl->sl_num++;
if (!sl->sl_playing) {
while ( sl->sl_num > sl->sl_size ) {
int i;
se = sl->sl_head;
......@@ -1612,6 +1617,7 @@ syncprov_add_slog( Operation *op )
ch_free( se );
sl->sl_num--;
}
}
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
}
}
......@@ -1646,6 +1652,8 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl,
num = sl->sl_num;
i = 0;
nmods = 0;
sl->sl_playing++;
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
uuids = op->o_tmpalloc( (num+1) * sizeof( struct berval ) +
num * UUID_LEN, op->o_tmpmemctx );
......@@ -1702,6 +1710,8 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl,
AC_MEMCPY(uuids[j].bv_val, se->se_uuid.bv_val, UUID_LEN);
uuids[j].bv_len = UUID_LEN;
}
ldap_pvt_thread_mutex_lock( &sl->sl_mutex );
sl->sl_playing--;
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
ndel = i;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment