[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Sync replication failure during startup.



Stelios Grigoriadis wrote:
Howard Chu wrote:
Can you please try the patch in rev 1.205 of syncprov.c and see
whether your test results improve? (You should remove your other
change to this source file first.)
I'm fairly new to this. All I can find is the 1.205 version of
syncprov.c which I can't use (compilation errors, ‘ConfigArgs’ has no
member named
‘cr_msg’ etc). Should I retrieve the latest throu CVS first?

I could't find any patch.

The patch is produced using: cvs diff -kk -r1.204 -r1.205 syncprov.c

But I've attached a copy here that should work with 2.3.

--
  -- Howard Chu
  Chief Architect, Symas Corp.  http://www.symas.com
  Director, Highland Sun        http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP     http://www.openldap.org/project/
Index: syncprov.c
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/overlays/syncprov.c,v
retrieving revision 1.56.2.45
diff -u -r1.56.2.45 syncprov.c
--- syncprov.c	22 Jul 2007 15:24:26 -0000	1.56.2.45
+++ syncprov.c	8 Oct 2007 13:08:21 -0000
@@ -1503,7 +1503,7 @@
 	{
 		struct berval maxcsn = BER_BVNULL;
 		char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
-		int do_check=0;
+		int do_check = 0, have_psearches;
 
 		/* Update our context CSN */
 		cbuf[0] = '\0';
@@ -1548,7 +1548,10 @@
 		opc->sctxcsn.bv_val = cbuf;
 
 		/* Handle any persistent searches */
-		if ( si->si_ops ) {
+		ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
+		have_psearches = ( si->si_ops != NULL );
+		ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
+		if ( have_psearches ) {
 			switch(op->o_tag) {
 			case LDAP_REQ_ADD:
 			case LDAP_REQ_MODIFY:
@@ -1653,12 +1656,19 @@
 {
 	slap_overinst		*on = (slap_overinst *)op->o_bd->bd_info;
 	syncprov_info_t		*si = on->on_bi.bi_private;
+	slap_callback *cb;
+	opcookie *opc;
+	int have_psearches, cbsize;
+
+	ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
+	have_psearches = ( si->si_ops != NULL );
+	ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
+
+	cbsize = sizeof(slap_callback) + sizeof(opcookie) +
+		(have_psearches ? sizeof(modinst) : 0 );
 
-	slap_callback *cb = op->o_tmpcalloc(1, sizeof(slap_callback)+
-		sizeof(opcookie) +
-		(si->si_ops ? sizeof(modinst) : 0 ),
-		op->o_tmpmemctx);
-	opcookie *opc = (opcookie *)(cb+1);
+	cb = op->o_tmpcalloc(1, cbsize, op->o_tmpmemctx);
+	opc = (opcookie *)(cb+1);
 	opc->son = on;
 	cb->sc_response = syncprov_op_response;
 	cb->sc_cleanup = syncprov_op_cleanup;
@@ -1669,7 +1679,7 @@
 	/* If there are active persistent searches, lock this operation.
 	 * See seqmod.c for the locking logic on its own.
 	 */
-	if ( si->si_ops ) {
+	if ( have_psearches ) {
 		modtarget *mt, mtdummy;
 		modinst *mi;
 
@@ -1716,7 +1726,7 @@
 		}
 	}
 
-	if (( si->si_ops || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )
+	if (( have_psearches || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )
 		syncprov_matchops( op, opc, 1 );
 
 	return SLAP_CB_CONTINUE;