Backport ITS#2512 replog order fix from HEAD

This commit is contained in:
Howard Chu 2004-01-24 02:21:41 +00:00
parent 1ebb48ca3f
commit c9ceb19cdc
7 changed files with 103 additions and 23 deletions

View file

@ -258,6 +258,8 @@ do_add( Connection *conn, Operation *op )
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 );
@ -305,13 +307,21 @@ do_add( Connection *conn, Operation *op )
}
#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;
}

View file

@ -199,19 +199,27 @@ do_delete(
*/
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

View file

@ -399,6 +399,8 @@ do_modify(
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 );
@ -427,14 +429,20 @@ do_modify(
}
}
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 */

View file

@ -375,20 +375,28 @@ do_modrdn(
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

View file

@ -796,6 +796,10 @@ LDAP_SLAPD_F (int) add_replica_attrs LDAP_P(( Backend *be,
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

View file

@ -102,6 +102,39 @@ print_vals( FILE *fp, struct berval *type, struct berval *bv );
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,

View file

@ -1612,6 +1612,15 @@ typedef struct slap_callback {
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
*/