int update = be->be_update_ndn.bv_len;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
+ slap_replog_ctx ctx;
+ slap_callback cb = {0};
rc = slap_mods_check( modlist, update, &text,
textbuf, textlen );
}
#endif /* LDAP_SLAPI */
- if ( (*be->be_add)( be, conn, op, e ) == 0 ) {
#ifdef SLAPD_MULTIMASTER
- if ( !repl_user )
+ if ( !repl_user )
#endif
- {
- replog( be, op, &e->e_name, &e->e_nname, e );
- }
+ {
+ ctx.prev = op->o_callback;
+ ctx.be = be;
+ ctx.dn = &e->e_name;
+ ctx.ndn = &e->e_nname;
+ ctx.change = e;
+ cb.sc_private = &ctx;
+ cb.sc_response = slap_replog_cb;
+ op->o_callback = &cb;
+ }
+
+ if ( (*be->be_add)( be, conn, op, e ) == 0 ) {
be_entry_release_w( be, conn, op, e );
e = NULL;
}
*/
if ( be->be_delete ) {
/* do the update here */
+ slap_replog_ctx ctx;
+ slap_callback cb = {0};
int repl_user = be_isupdate( be, &op->o_ndn );
#ifndef SLAPD_MULTIMASTER
if ( !be->be_update_ndn.bv_len || repl_user )
#endif
{
- if ( (*be->be_delete)( be, conn, op, &pdn, &ndn ) == 0 ) {
#ifdef SLAPD_MULTIMASTER
- if ( !be->be_update_ndn.bv_len || !repl_user )
+ if ( !be->be_update_ndn.bv_len || !repl_user )
#endif
- {
- replog( be, op, &pdn, &ndn, NULL );
- }
+ {
+ ctx.prev = op->o_callback;
+ ctx.be = be;
+ ctx.dn = &pdn;
+ ctx.ndn = &ndn;
+ ctx.change = NULL;
+ cb.sc_private = &ctx;
+ cb.sc_response = slap_replog_cb;
+ op->o_callback = &cb;
}
+ rc = (*be->be_delete)( be, conn, op, &pdn, &ndn );
#ifndef SLAPD_MULTIMASTER
} else {
BerVarray defref = be->be_update_refs
const char *text;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
+ slap_replog_ctx ctx;
+ slap_callback cb = {0};
rc = slap_mods_check( modlist, update, &text,
textbuf, textlen );
}
}
- if ( (*be->be_modify)( be, conn, op, &pdn, &ndn, modlist ) == 0
#ifdef SLAPD_MULTIMASTER
- && !repl_user
+ if ( !repl_user )
#endif
- ) {
- /* but we log only the ones not from a replicator user */
- replog( be, op, &pdn, &ndn, modlist );
+ {
+ ctx.prev = op->o_callback;
+ ctx.be = be;
+ ctx.dn = &pdn;
+ ctx.ndn = &ndn;
+ ctx.change = modlist;
+ cb.sc_private = &ctx;
+ cb.sc_response = slap_replog_cb;
+ op->o_callback = &cb;
}
+ rc = (*be->be_modify)( be, conn, op, &pdn, &ndn, modlist );
#ifndef SLAPD_MULTIMASTER
/* send a referral */
if ( !be->be_update_ndn.bv_len || repl_user )
#endif
{
- if ( (*be->be_modrdn)( be, conn, op, &pdn, &ndn,
- &pnewrdn, &nnewrdn, deloldrdn,
- pnewS, nnewS ) == 0
+ struct slap_replog_moddn moddn;
+ slap_replog_ctx ctx;
+ slap_callback cb = {0};
#ifdef SLAPD_MULTIMASTER
- && ( !be->be_update_ndn.bv_len || !repl_user )
+ if ( !repl_user )
#endif
- ) {
- struct slap_replog_moddn moddn;
+ {
moddn.newrdn = &pnewrdn;
moddn.deloldrdn = deloldrdn;
moddn.newsup = &pnewSuperior;
-
- replog( be, op, &pdn, &ndn, &moddn );
+ ctx.prev = op->o_callback;
+ ctx.be = be;
+ ctx.dn = &pdn;
+ ctx.ndn = &ndn;
+ ctx.change = &moddn;
+ cb.sc_private = &ctx;
+ cb.sc_response = slap_replog_cb;
+ op->o_callback = &cb;
}
+ rc = (*be->be_modrdn)( be, conn, op, &pdn, &ndn,
+ &pnewrdn, &nnewrdn, deloldrdn,
+ pnewS, nnewS );
#ifndef SLAPD_MULTIMASTER
} else {
BerVarray defref = be->be_update_refs
int nr, char *attrs, int exclude ));
LDAP_SLAPD_F (void) replog LDAP_P(( Backend *be, Operation *op,
struct berval *dn, struct berval *ndn, void *change ));
+LDAP_SLAPD_F (void) slap_replog_cb LDAP_P(( Connection *c, Operation *op,
+ ber_tag_t tag, ber_int_t msgid, ber_int_t err, const char *matched,
+ const char *text, BerVarray ref, const char *resoid,
+ struct berval *resdata, struct berval *sasldata, LDAPControl **ct ));
/*
* result.c
static void
replog1( struct slap_replica_info *ri, Operation *op, void *change, FILE *fp, struct berval *dn, long now);
+/* invoke replog from a callback to preserve replog order */
+void
+slap_replog_cb(
+ Connection *c,
+ Operation *op,
+ ber_tag_t tag,
+ ber_int_t msgid,
+ ber_int_t err,
+ const char *matched,
+ const char *text,
+ BerVarray ref,
+ const char *resoid,
+ struct berval *resdata,
+ struct berval *sasldata,
+ LDAPControl **ctrls
+)
+{
+ slap_callback *tmp = op->o_callback;
+ slap_replog_ctx *ctx = tmp->sc_private;
+
+ if ( err == LDAP_SUCCESS ) {
+ replog( ctx->be, op, ctx->dn, ctx->ndn, ctx->change );
+ }
+ op->o_callback = ctx->prev;
+ if ( op->o_callback && op->o_callback->sc_response ) {
+ op->o_callback->sc_response(c, op, tag, msgid, err, matched,
+ text, ref, resoid, resdata, sasldata, ctrls );
+ } else {
+ send_ldap_result( c, op, err, matched, text, ref, ctrls );
+ }
+ op->o_callback = tmp;
+}
+
void
replog(
Backend *be,
void *sc_private;
} slap_callback;
+/* callback context for invoking replog */
+typedef struct slap_replog_ctx {
+ slap_callback *prev;
+ BackendDB *be;
+ struct berval *dn;
+ struct berval *ndn;
+ void *change;
+} slap_replog_ctx;
+
/*
* Paged Results state
*/