From 5c1c0902b46a0b0447f509ff2150a0794c25f9e2 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 1 Sep 2004 03:23:36 +0000 Subject: [PATCH] ITS#3309 fix syncrepl psearch propagation of Delete operations --- servers/slapd/back-bdb/delete.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index 148230ec01..c62a51cb53 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -19,6 +19,8 @@ #include #include +#include "lutil.h" + #include "back-bdb.h" #include "external.h" @@ -47,6 +49,8 @@ bdb_delete( Operation *op, SlapReply *rs ) EntryInfo *suffix_ei; Entry *ctxcsn_e; int ctxcsn_added = 0; + char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ]; + struct berval csn; LDAPControl **preread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; @@ -65,6 +69,8 @@ bdb_delete( Operation *op, SlapReply *rs ) op->o_req_dn.bv_val, 0, 0 ); #endif + slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, 1 ); + if( 0 ) { retry: /* transaction retry */ if( e != NULL ) { @@ -579,6 +585,19 @@ retry: /* transaction retry */ } if ( rs->sr_err == LDAP_SUCCESS && !op->o_no_psearch ) { + Attribute *a; + a = attr_find( e->e_attrs, slap_schema.si_ad_entryCSN ); + if ( a ) { + if( (void *) e->e_attrs != (void *) (e+1)) { + attr_delete( &e->e_attrs, slap_schema.si_ad_entryCSN ); + attr_merge_normalize_one( e, slap_schema.si_ad_entryCSN, + &csn, NULL ); + } else { + a->a_vals[0] = csn; + } + } else { + /* Hm, the entryCSN ought to exist. ??? */ + } ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock ); LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) { rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_DELETE ); -- 2.39.5