From 575706573683fec8618b7f67309dc189cfd802ac Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 27 Jul 2006 10:44:22 +0000 Subject: [PATCH] ITS#4622 syncrepl: don't save contextCSN on incoming context entry syncprov: delete contextCSN on checkpoint if ctxcsn is empty --- servers/slapd/overlays/syncprov.c | 24 +++++++++++++++--------- servers/slapd/syncrepl.c | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index c9de4aec8e..271a48a672 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -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 ); } diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index d0c94978cb..311acd85d0 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -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 ); -- 2.39.2