]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/syncrepl.c
implement search timeout when the remote server does not respond in the specified...
[openldap] / servers / slapd / syncrepl.c
index c8048bd2c49dd9f4151ad2244c85e1d0e3b326fc..72374ec545cee7451b0037308f8ed4808249959f 100644 (file)
@@ -828,9 +828,10 @@ do_syncrep2(
                                                                struct berval *syncuuid_bv;
                                                                syncuuid_bv = ber_dupbv( NULL, &syncUUIDs[i] );
                                                                slap_sl_free( syncUUIDs[i].bv_val,op->o_tmpmemctx );
-                                                               avl_insert( &si->si_presentlist,
+                                                               if ( avl_insert( &si->si_presentlist,
                                                                        (caddr_t) syncuuid_bv,
-                                                                       syncuuid_cmp, avl_dup_error );
+                                                                       syncuuid_cmp, avl_dup_error ))
+                                                                       ber_bvfree( syncuuid_bv );
                                                        }
                                                        slap_sl_free( syncUUIDs, op->o_tmpmemctx );
                                                }
@@ -1325,9 +1326,14 @@ syncrepl_message_to_op(
                op->orr_modlist = NULL;
                if ( slap_modrdn2mods( op, &rs ))
                        goto done;
-               /* FIXME: append entryCSN, modifiersName, modifyTimestamp to
-                * modlist here. Should accesslog give these to us in a reqMod?
-                */
+               /* Append modlist for operational attrs */
+               {
+                       Modifications *m;
+
+                       for ( m = op->orr_modlist; m->sml_next; m = m->sml_next ) ;
+                       m->sml_next = modlist;
+                       modlist = NULL;
+               }
                rc = op->o_bd->be_modrdn( op, &rs );
                slap_mods_free( op->orr_modlist, 1 );
                Debug( rc ? LDAP_DEBUG_ANY : LDAP_DEBUG_SYNC,
@@ -1407,12 +1413,6 @@ syncrepl_message_to_entry(
                return rc;
        }
 
-       dnPrettyNormal( NULL, &bdn, &dn, &ndn, op->o_tmpmemctx );
-       ber_dupbv( &op->o_req_dn, &dn );
-       ber_dupbv( &op->o_req_ndn, &ndn );
-       slap_sl_free( ndn.bv_val, op->o_tmpmemctx );
-       slap_sl_free( dn.bv_val, op->o_tmpmemctx );
-
        if ( syncstate == LDAP_SYNC_PRESENT || syncstate == LDAP_SYNC_DELETE ) {
                /* NOTE: this could be done even before decoding the DN,
                 * although encoding errors wouldn't be detected */
@@ -1425,6 +1425,12 @@ syncrepl_message_to_entry(
                goto done;
        }
 
+       dnPrettyNormal( NULL, &bdn, &dn, &ndn, op->o_tmpmemctx );
+       ber_dupbv( &op->o_req_dn, &dn );
+       ber_dupbv( &op->o_req_ndn, &ndn );
+       slap_sl_free( ndn.bv_val, op->o_tmpmemctx );
+       slap_sl_free( dn.bv_val, op->o_tmpmemctx );
+
        e = entry_alloc();
        e->e_name = op->o_req_dn;
        e->e_nname = op->o_req_ndn;
@@ -1489,7 +1495,7 @@ syncrepl_message_to_entry(
                        modtail = &mod->sml_next;
                }
        }
-       
+
        rc = slap_mods2entry( *modlist, &e, 1, 1, &text, txtbuf, textlen);
        if( rc != LDAP_SUCCESS ) {
                Debug( LDAP_DEBUG_ANY, "syncrepl_message_to_entry: rid %03ld mods2entry (%s)\n",
@@ -1603,8 +1609,11 @@ syncrepl_entry(
        if (( syncstate == LDAP_SYNC_PRESENT || syncstate == LDAP_SYNC_ADD )) {
                if ( !si->si_refreshPresent ) {
                        syncuuid_bv = ber_dupbv( NULL, syncUUID );
-                       avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv,
-                               syncuuid_cmp, avl_dup_error );
+                       if ( avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv,
+                               syncuuid_cmp, avl_dup_error )) {
+                               ber_bvfree( syncuuid_bv );
+                               syncuuid_bv = NULL;
+                       }
                }
        }
 
@@ -1616,12 +1625,31 @@ syncrepl_entry(
                }
        }
 
+       (void)slap_uuidstr_from_normalized( &syncUUID_strrep, syncUUID, op->o_tmpmemctx );
+       if ( syncstate != LDAP_SYNC_DELETE ) {
+               Attribute       *a = attr_find( entry->e_attrs, slap_schema.si_ad_entryUUID );
+
+               if ( a == NULL ) {
+                       /* add if missing */
+                       attr_merge_one( entry, slap_schema.si_ad_entryUUID,
+                               &syncUUID_strrep, syncUUID );
+
+               } else if ( !bvmatch( &a->a_nvals[0], syncUUID ) ) {
+                       /* replace only if necessary */
+                       if ( a->a_nvals != a->a_vals ) {
+                               ber_memfree( a->a_nvals[0].bv_val );
+                               ber_dupbv( &a->a_nvals[0], syncUUID );
+                       }
+                       ber_memfree( a->a_vals[0].bv_val );
+                       ber_dupbv( &a->a_vals[0], &syncUUID_strrep );
+               }
+       }
+
        f.f_choice = LDAP_FILTER_EQUALITY;
        f.f_ava = &ava;
        ava.aa_desc = slap_schema.si_ad_entryUUID;
        ava.aa_value = *syncUUID;
 
-       (void)slap_uuidstr_from_normalized( &syncUUID_strrep, syncUUID, op->o_tmpmemctx );
        if ( syncuuid_bv ) {
                Debug( LDAP_DEBUG_SYNC, "syncrepl_entry: rid %03ld inserted UUID %s\n",
                        si->si_rid, syncUUID_strrep.bv_val, 0 );
@@ -1683,37 +1711,19 @@ syncrepl_entry(
                                si->si_rid, dni.dn.bv_val ? dni.dn.bv_val : "(null)", 0 );
        }
 
-       if ( syncstate != LDAP_SYNC_DELETE ) {
-               Attribute       *a = attr_find( entry->e_attrs, slap_schema.si_ad_entryUUID );
-
-               if ( a == NULL ) {
-                       /* add if missing */
-                       attr_merge_one( entry, slap_schema.si_ad_entryUUID,
-                               &syncUUID_strrep, syncUUID );
-
-               } else if ( !bvmatch( &a->a_nvals[0], syncUUID ) ) {
-                       /* replace only if necessary */
-                       if ( a->a_nvals != a->a_vals ) {
-                               ber_memfree( a->a_nvals[0].bv_val );
-                               ber_dupbv( &a->a_nvals[0], syncUUID );
-                       }
-                       ber_memfree( a->a_vals[0].bv_val );
-                       ber_dupbv( &a->a_vals[0], &syncUUID_strrep );
-               }
-               /* Don't save the contextCSN on the inooming context entry,
-                * we'll write it when syncrepl_updateCookie eventually
-                * gets called. (ITS#4622)
-                */
-               if ( syncstate == LDAP_SYNC_ADD && dn_match( &entry->e_nname,
-                       &be->be_nsuffix[0] )) {
-                       Attribute **ap;
-                       for ( ap = &entry->e_attrs; *ap; ap=&(*ap)->a_next ) {
-                               a = *ap;
-                               if ( a->a_desc == slap_schema.si_ad_contextCSN ) {
-                                       *ap = a->a_next;
-                                       attr_free( a );
-                                       break;
-                               }
+       /* Don't save the contextCSN on the inooming context entry,
+        * we'll write it when syncrepl_updateCookie eventually
+        * gets called. (ITS#4622)
+        */
+       if ( syncstate == LDAP_SYNC_ADD && dn_match( &entry->e_nname,
+               &be->be_nsuffix[0] )) {
+               Attribute *a, **ap;
+               for ( ap = &entry->e_attrs; *ap; ap=&(*ap)->a_next ) {
+                       a = *ap;
+                       if ( a->a_desc == slap_schema.si_ad_contextCSN ) {
+                               *ap = a->a_next;
+                               attr_free( a );
+                               break;
                        }
                }
        }
@@ -2280,7 +2290,7 @@ syncrepl_updateCookie(
        Modifications mod = { { 0 } };
        struct berval vals[ 2 ];
 
-       int rc;
+       int rc, flags;
 
        slap_callback cb = { NULL };
        SlapReply       rs_modify = {REP_RESULT};
@@ -2308,7 +2318,10 @@ syncrepl_updateCookie(
        /* update contextCSN */
        op->o_msgid = SLAP_SYNC_UPDATE_MSGID;
        op->orm_modlist = &mod;
+       flags = SLAP_DBFLAGS( op->o_bd );
+       SLAP_DBFLAGS( op->o_bd ) |= SLAP_DBFLAG_NOLASTMOD;
        rc = be->be_modify( op, &rs_modify );
+       SLAP_DBFLAGS( op->o_bd ) = flags;
        op->o_msgid = 0;
 
        if ( rs_modify.sr_err == LDAP_SUCCESS ) {
@@ -2446,7 +2459,8 @@ attr_cmp( Operation *op, Attribute *old, Attribute *new,
                *modtail = mod;
                modtail = &mod->sml_next;
        } else {
-               *mcur = &mod->sml_next;
+               if ( mod )
+                       *mcur = &mod->sml_next;
        }
        *mret = modtail;
 }
@@ -3375,7 +3389,7 @@ add_syncrepl(
                         * in case they really want to do this, they can vary
                         * the case of the URL to allow it.
                         */
-                       if ( l ) {
+                       if ( l && !SLAP_DBHIDDEN( c->be )) {
                                int i;
                                for ( i=0; l[i]; i++ ) {
                                        if ( bvmatch( &l[i]->sl_url, &si->si_bindconf.sb_uri )) {