]> git.sur5r.net Git - openldap/commitdiff
ITS#5537
authorQuanah Gibson-Mount <quanah@openldap.org>
Fri, 30 May 2008 00:57:32 +0000 (00:57 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 30 May 2008 00:57:32 +0000 (00:57 +0000)
CHANGES
servers/slapd/overlays/syncprov.c

diff --git a/CHANGES b/CHANGES
index 26d5228a74e5ff05f0bd1e15aa77b9c15f726a1c..ec13b000fdc88f596b43ae3b9aa6927d5aaf5a12 100644 (file)
--- 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
index d480958ac78eea7c54ab2023df6696a0d88b0bcf..d525cb6c46a5154401e6d32920ba32d9c63b3643 100644 (file)
@@ -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; i<si->si_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; i<si->si_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 ) ) {