]> git.sur5r.net Git - openldap/commitdiff
Backport ITS#2512 replog order fix from HEAD
authorHoward Chu <hyc@openldap.org>
Sat, 24 Jan 2004 02:21:41 +0000 (02:21 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 24 Jan 2004 02:21:41 +0000 (02:21 +0000)
servers/slapd/add.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c
servers/slapd/proto-slap.h
servers/slapd/repl.c
servers/slapd/slap.h

index 05c4ee17c3dd665978a8fc6d0467b5a2f1e4f6d4..8bf40157c5f7d2c395c8a5ca3cc74a6bd8e36deb 100644 (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;
                        }
index 131dee64933ef070333e4fbc0e3ea78666deb097..5b3df80eec45d29d67dfd6311800bcc16100d528 100644 (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
index 9e7a8d96c2e05e29a68b463816143420db5004e2..34bec6be2884f4310f3e5d1e7496bcb8700a1fec 100644 (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 */
index 109e8f6ab5a4fdc51a6ccee58641e071af33a18b..0d2af6ab573832a2f9d627112fe3aa31206467e3 100644 (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
index 9bfb3e3cdc7d1d74ddb73ccc6812081d3a793390..31227f6a632f209d558f418d19d8ad1f0e272bed 100644 (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
index 03630be9498d0ddc56df8680da939d4810ddd191..43047585d35bf83b1bde6d4f27f89e0e56058338 100644 (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,
index 7d01cc666a701ac7193a0a1a2948dc68c679ee02..a218043f96e2740626395bf9a6b5eb6a99bbedaf 100644 (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
  */