syncrepl: don't save contextCSN on incoming context entry
  syncprov: delete contextCSN on checkpoint if ctxcsn is empty
This commit is contained in:
Howard Chu 2006-07-27 10:44:22 +00:00
parent acea44af02
commit 5757065736
2 changed files with 31 additions and 9 deletions

View File

@ -1244,9 +1244,14 @@ syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on )
struct berval bv[2];
slap_callback cb = {0};
mod.sml_values = bv;
bv[1].bv_val = NULL;
bv[0] = si->si_ctxcsn;
/* If ctxcsn is empty, delete it */
if ( BER_BVISEMPTY( &si->si_ctxcsn )) {
mod.sml_values = NULL;
} else {
mod.sml_values = bv;
bv[1].bv_val = NULL;
bv[0] = si->si_ctxcsn;
}
mod.sml_nvalues = NULL;
mod.sml_desc = slap_schema.si_ad_contextCSN;
mod.sml_op = LDAP_MOD_REPLACE;
@ -2376,15 +2381,16 @@ syncprov_db_open(
ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op );
ldap_pvt_thread_join( tid, NULL );
}
} else if ( SLAP_SYNC_SHADOW( op->o_bd )) {
/* If we're also a consumer, and we didn't find the context entry,
* then don't generate anything, wait for our provider to send it
* to us.
*/
goto out;
}
if ( BER_BVISEMPTY( &si->si_ctxcsn ) ) {
if ( SLAP_SYNC_SHADOW( op->o_bd )) {
/* If we're also a consumer, and we didn't get a contextCSN,
* then don't generate anything, wait for our provider to send it
* to us.
*/
goto out;
}
si->si_ctxcsn.bv_len = sizeof( si->si_ctxcsnbuf );
slap_get_csn( op, &si->si_ctxcsn, 0 );
}

View File

@ -1769,6 +1769,22 @@ syncrepl_entry(
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;
}
}
}
}
slap_op_time( &op->o_time, &op->o_tincr );