diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c
index e4d363d36b5742f6d17083877de154368988a1b8..a0c6e9aa8f14dbf806d30b6005240c01e0fd2dfe 100644
--- a/servers/slapd/overlays/syncprov.c
+++ b/servers/slapd/overlays/syncprov.c
@@ -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;