From e3f344bcbd2d4b6d553db27ebf8f38aa048463dc Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 13 Jan 2011 22:45:59 +0000 Subject: [PATCH] ITS#6717 refine mincsn check for MMR --- servers/slapd/overlays/syncprov.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index ff517e275b..14aed8cbd7 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -2414,7 +2414,7 @@ syncprov_op_search( Operation *op, SlapReply *rs ) sync_control *srs; BerVarray ctxcsn; int i, *sids, numcsns; - struct berval mincsn; + struct berval mincsn, maxcsn; int dirty = 0; if ( !(op->o_sync_mode & SLAP_SYNC_REFRESH) ) return SLAP_CB_CONTINUE; @@ -2529,12 +2529,27 @@ syncprov_op_search( Operation *op, SlapReply *rs ) i++; } - /* Find the smallest CSN */ - mincsn = srs->sr_state.ctxcsn[0]; - for ( i=1; isr_state.numcsns; i++ ) { - if ( ber_bvcmp( &mincsn, &srs->sr_state.ctxcsn[i] ) > 0 ) - mincsn = srs->sr_state.ctxcsn[i]; - } + /* Find the smallest CSN which differs from contextCSN */ + mincsn.bv_len = 0; + maxcsn.bv_len = 0; + for ( i=0; isr_state.numcsns; i++ ) { + for ( j=0; jsr_state.sids[i] != sids[j] ) + continue; + if ( BER_BVISEMPTY( &maxcsn ) || ber_bvcmp( &maxcsn, + &srs->sr_state.ctxcsn[i] ) < 0 ) { + maxcsn = srs->sr_state.ctxcsn[i]; + } + if ( ber_bvcmp( &srs->sr_state.ctxcsn[i], &ctxcsn[j] ) < 0) { + if ( BER_BVISEMPTY( &mincsn ) || ber_bvcmp( &mincsn, + &srs->sr_state.ctxcsn[i] ) > 0 ) { + mincsn = srs->sr_state.ctxcsn[i]; + } + } + } + } + if ( BER_BVISEMPTY( &mincsn )) + mincsn = maxcsn; /* If nothing has changed, shortcut it */ if ( srs->sr_state.numcsns == numcsns ) { -- 2.39.5