From e53d79c02c0fa5833493cf80da47efd0c3d774f4 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Fri, 30 May 2008 00:57:32 +0000 Subject: [PATCH] ITS#5537 --- CHANGES | 1 + servers/slapd/overlays/syncprov.c | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 26d5228a74..ec13b000fd 100644 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,7 @@ OpenLDAP 2.4.10 Engineering Fixed slapo-syncprov op2.o_extra reset (ITS#5501, #5506) Fixed slapo-syncprov searching wrong backend (ITS#5487) Fixed slapo-syncprov sending ops without queued CSNs (ITS#5465) + Fixed slapo-syncprov max csn search on startup (ITS#5537) Fixed slapo-unique config structs (ITS#5526) Fixed slapo-unique filter terminator (ITS#5511) Documentation diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index d480958ac7..d525cb6c46 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -497,7 +497,8 @@ findmax_cb( Operation *op, SlapReply *rs ) Attribute *a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN ); - if ( a && ber_bvcmp( &a->a_vals[0], maxcsn ) > 0 ) { + if ( a && ber_bvcmp( &a->a_vals[0], maxcsn ) > 0 && + slap_parse_csn_sid( &a->a_vals[0] ) == slap_serverID ) { maxcsn->bv_len = a->a_vals[0].bv_len; strcpy( maxcsn->bv_val, a->a_vals[0].bv_val ); } @@ -587,7 +588,7 @@ syncprov_findcsn( Operation *op, find_csn_t mode ) sync_control *srs = NULL; struct slap_limits_set fc_limits; int i, rc = LDAP_SUCCESS, findcsn_retry = 1; - int maxid = 0; + int maxid; if ( mode != FIND_MAXCSN ) { srs = op->o_controls[slap_cids.sc_LDAPsync]; @@ -613,14 +614,20 @@ again: switch( mode ) { case FIND_MAXCSN: cf.f_choice = LDAP_FILTER_GE; - cf.f_av_value = si->si_ctxcsn[0]; - /* If there are multiple CSNs, use the largest */ - for ( i=1; isi_numcsns; i++) { - if ( ber_bvcmp( &cf.f_av_value, &si->si_ctxcsn[i] ) < 0 ) { - cf.f_av_value = si->si_ctxcsn[i]; + /* If there are multiple CSNs, use the one with our serverID */ + for ( i=0; isi_numcsns; i++) { + if ( slap_serverID == si->si_sids[i] ) { maxid = i; + break; } } + if ( i == si->si_numcsns ) { + /* No match: this is multimaster, and none of the content in the DB + * originated locally. Treat like no CSN. + */ + return LDAP_NO_SUCH_OBJECT; + } + cf.f_av_value = si->si_ctxcsn[maxid]; fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ), "(entryCSN>=%s)", cf.f_av_value.bv_val ); if ( fop.ors_filterstr.bv_len < 0 || fop.ors_filterstr.bv_len >= sizeof( buf ) ) { -- 2.39.5