From 95a54510031a25d92255355b4bb717287020fe7f Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@openldap.org>
Date: Wed, 9 Oct 2013 04:58:37 -0700
Subject: [PATCH] ITS#7710 fix for non-replicated internal ops

Their completion was making slap_graduate_commit_csn() cleanup
their parent op's CSN, thus preventing that CSN from propagating
to any consumers.
---
 servers/slapd/overlays/memberof.c | 4 ++++
 servers/slapd/overlays/refint.c   | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/servers/slapd/overlays/memberof.c b/servers/slapd/overlays/memberof.c
index c3cc3cfbf0..3f07ffb521 100644
--- a/servers/slapd/overlays/memberof.c
+++ b/servers/slapd/overlays/memberof.c
@@ -341,6 +341,7 @@ memberof_value_modify(
 	memberof_t	*mo = (memberof_t *)on->on_bi.bi_private;
 
 	Operation	op2 = *op;
+	unsigned long opid = op->o_opid;
 	SlapReply	rs2 = { REP_RESULT };
 	slap_callback	cb = { NULL, slap_null_cb, NULL, NULL };
 	Modifications	mod[ 2 ] = { { { 0 } } }, *ml;
@@ -358,6 +359,7 @@ memberof_value_modify(
 	op2.orm_modlist = NULL;
 
 	/* Internal ops, never replicate these */
+	op2.o_opid = 0;		/* shared with op, saved above */
 	op2.orm_no_opattrs = 1;
 	op2.o_dont_replicate = 1;
 
@@ -472,6 +474,8 @@ memberof_value_modify(
 			slap_mods_free( ml, 1 );
 		}
 	}
+	/* restore original opid */
+	op->o_opid = opid;
 
 	/* FIXME: if old_group_ndn doesn't exist, both delete __and__
 	 * add will fail; better split in two operations, although
diff --git a/servers/slapd/overlays/refint.c b/servers/slapd/overlays/refint.c
index 2aaffe7918..4f7a3f6e45 100644
--- a/servers/slapd/overlays/refint.c
+++ b/servers/slapd/overlays/refint.c
@@ -527,6 +527,7 @@ refint_repair(
 	dependent_data	*dp;
 	SlapReply		rs = {REP_RESULT};
 	Operation		op2;
+	unsigned long	opid;
 	int		rc;
 
 	op->o_callback->sc_response = refint_search_cb;
@@ -565,6 +566,7 @@ refint_repair(
 	 *
 	 */
 
+	opid = op2.o_opid;
 	op2 = *op;
 	for ( dp = rq->attrs; dp; dp = dp->next ) {
 		SlapReply	rs2 = {REP_RESULT};
@@ -587,6 +589,7 @@ refint_repair(
 		/* Internal ops, never replicate these */
 		op2.orm_no_opattrs = 1;
 		op2.o_dont_replicate = 1;
+		op2.o_opid = 0;
 
 		/* Set our ModifiersName */
 		if ( SLAP_LASTMOD( op->o_bd ) ) {
@@ -686,6 +689,7 @@ refint_repair(
 			op2.o_tmpfree( m, op2.o_tmpmemctx );
 		}
 	}
+	op2.o_opid = opid;
 
 	return 0;
 }
-- 
GitLab