diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 1dbe6653734a3815d567b4a74a69ba545e977f6e..dbd36150764bd669ccaac706b530bd5c04219f6f 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -1705,7 +1705,7 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, { slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; slog_entry *se; - int i, j, ndel, num, nmods, mmods; + int i, j, ndel, num, nmods, mmods, *sidchks; char cbuf[LDAP_PVT_CSNSTR_BUFSIZE]; BerVarray uuids; struct berval delcsn[2]; @@ -1721,6 +1721,7 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, sl->sl_playing++; ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); + sidchks = op->o_tmpcalloc( srs->sr_state.numcsns + 1, sizeof(int), op->o_tmpmemctx ); uuids = op->o_tmpalloc( (num+1) * sizeof( struct berval ) + num * UUID_LEN, op->o_tmpmemctx ); uuids[0].bv_val = (char *)(uuids + num + 1); @@ -1733,31 +1734,45 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, * and everything else at the end. Do this first so we can * unlock the list mutex. */ - Debug( LDAP_DEBUG_SYNC, "srs csn %s\n", - srs->sr_state.ctxcsn[0].bv_val, 0, 0 ); for ( se=sl->sl_head; se; se=se->se_next ) { int k; - if ( LogTest( LDAP_DEBUG_SYNC ) ) { - char uuidstr[40]; - lutil_uuidstr_from_normalized( se->se_uuid.bv_val, se->se_uuid.bv_len, - uuidstr, 40 ); - Log4( LDAP_DEBUG_SYNC, ldap_syslog_level, "%s syncprov_playlog: " - "log entry tag=%lu uuid=%s cookie=%s\n", - op->o_log_prefix, se->se_tag, uuidstr, se->se_csn.bv_val ); - } ndel = 1; for ( k=0; k<srs->sr_state.numcsns; k++ ) { if ( se->se_sid == srs->sr_state.sids[k] ) { ndel = ber_bvcmp( &se->se_csn, &srs->sr_state.ctxcsn[k] ); + if ( !sidchks[k] || ndel > 0 ) { + if ( LogTest( LDAP_DEBUG_SYNC ) ) { + char uuidstr[40], *uuidp; + if ( se->se_uuid.bv_len ) { + lutil_uuidstr_from_normalized( se->se_uuid.bv_val, se->se_uuid.bv_len, + uuidstr, 40 ); + uuidp = uuidstr; + } else { + uuidp = ""; + } + if ( !sidchks[k] ) { + Log2( LDAP_DEBUG_SYNC, ldap_syslog_level, "%s syncprov_playlog: " + "srs csn %s\n", + op->o_log_prefix, srs->sr_state.ctxcsn[k].bv_val ); + } + Log4( LDAP_DEBUG_SYNC, ldap_syslog_level, "%s syncprov_playlog: " + "log entry tag=%lu uuid=%s cookie=%s\n", + op->o_log_prefix, se->se_tag, uuidp, se->se_csn.bv_val ); + } + } break; } } if ( ndel <= 0 ) { - Debug( LDAP_DEBUG_SYNC, "%s syncprov_playlog: " - "cmp %d, too old\n", op->o_log_prefix, ndel, 0 ); + if ( !sidchks[k] ) { + Debug( LDAP_DEBUG_SYNC, "%s syncprov_playlog: " + "cmp %d, too old\n", op->o_log_prefix, ndel, 0 ); + sidchks[k] = 1; + } continue; } + sidchks[k] = 1; ndel = 0; for ( k=0; k<numcsns; k++ ) { if ( se->se_sid == sids[k] ) { @@ -1800,6 +1815,8 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, sl->sl_playing--; ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); + op->o_tmpfree( sidchks, op->o_tmpmemctx ); + ndel = i; /* Zero out unused slots */