From: Quanah Gibson-Mount Date: Mon, 17 Nov 2008 23:35:18 +0000 (+0000) Subject: More for ITS#5809 X-Git-Tag: OPENLDAP_REL_ENG_2_4_13~28 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=48691b22cb3ee3a05c20a35a693d1420a1fd5d3f;p=openldap More for ITS#5809 --- diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 7109d11013..d46c94ed7c 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -1932,7 +1932,6 @@ typedef struct dninfo { struct berval dn; struct berval ndn; int renamed; /* Was an existing entry renamed? */ - int delOldRDN; /* Was old RDN deleted? */ Modifications **modlist; /* the modlist we received */ Modifications *mods; /* the modlist we compared */ } dninfo; @@ -2217,7 +2216,8 @@ retry_add:; op->orr_newSup = NULL; op->orr_nnewSup = NULL; } - op->orr_deleteoldrdn = dni.delOldRDN; + /* Let the modify handler take care of deleting old RDNs */ + op->orr_deleteoldrdn = 0; op->orr_modlist = NULL; if ( ( rc = slap_modrdn2mods( op, &rs_modify ) ) ) { goto done; @@ -2229,39 +2229,9 @@ retry_add:; noldp = op->orr_nnewrdn; ber_dupbv_x( &op->orr_nnewrdn, &noldp, op->o_tmpmemctx ); - /* Setup opattrs too */ - { - static AttributeDescription *nullattr = NULL; - static AttributeDescription **const opattrs[] = { - &slap_schema.si_ad_entryCSN, - &slap_schema.si_ad_modifiersName, - &slap_schema.si_ad_modifyTimestamp, - &nullattr - }; - AttributeDescription *opattr; - Modifications *mod, **modtail, **ml; - int i; - - for ( mod = op->orr_modlist; - mod->sml_next; - mod = mod->sml_next ) - ; - modtail = &mod->sml_next; - - /* pull mod off incoming modlist, append to orr_modlist */ - for ( i = 0; (opattr = *opattrs[i]) != NULL; i++ ) { - for ( ml = modlist; *ml; ml = &(*ml)->sml_next ) - { - if ( (*ml)->sml_desc == opattr ) { - mod = *ml; - *ml = mod->sml_next; - mod->sml_next = NULL; - *modtail = mod; - modtail = &mod->sml_next; - break; - } - } - } + /* Remove the CSN for now, only propagate the Modify */ + if ( syncCSN ) { + slap_graduate_commit_csn( op ); } op->o_bd = si->si_wbe; rc = op->o_bd->be_modrdn( op, &rs_modify ); @@ -2273,7 +2243,12 @@ retry_add:; "syncrepl_entry: %s be_modrdn (%d)\n", si->si_ridtxt, rc, 0 ); op->o_bd = be; - /* Renamed entries may still have other mods so just fallthru */ + /* Renamed entries still have other mods so just fallthru */ + op->o_req_dn = entry->e_name; + op->o_req_ndn = entry->e_nname; + if ( syncCSN ) { + slap_queue_csn( op, syncCSN ); + } } if ( dni.mods ) { op->o_tag = LDAP_REQ_MODIFY; @@ -3038,27 +3013,8 @@ dn_callback( if ( !dn_match( &old_rdn, &new_rdn ) || ber_bvstrcasecmp( &old_p, &new_p )) { - struct berval oldRDN, oldVal; - AttributeDescription *ad = NULL; - Attribute *a; - dni->renamed = 1; - /* See if the oldRDN was deleted */ - dnRdn( &rs->sr_entry->e_nname, &oldRDN ); - oldVal.bv_val = strchr(oldRDN.bv_val, '=') + 1; - oldVal.bv_len = oldRDN.bv_len - ( oldVal.bv_val - - oldRDN.bv_val ); - oldRDN.bv_len -= oldVal.bv_len + 2; - slap_bv2ad( &oldRDN, &ad, &rs->sr_text ); - a = attr_find( dni->new_entry->e_attrs, ad ); - if ( !a || attr_valfind( a, - SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH | - SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH | - SLAP_MR_VALUE_OF_SYNTAX, - &oldVal, NULL, op->o_tmpmemctx ) != LDAP_SUCCESS ) - { - dni->delOldRDN = 1; - } + /* A ModDN has happened, but other changes may have * occurred before we picked it up. So fallthru to * regular Modify processing.