--- servers/slapd/overlays/syncprov.c 2010/12/12 00:47:22 1.147.2.76 +++ servers/slapd/overlays/syncprov.c 2010/11/15 14:42:06 1.316 @@ -1,4 +1,4 @@ -/* $OpenLDAP$ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.315 2010/07/28 00:21:27 hyc Exp $ */ /* syncprov.c - syncrepl provider */ /* This work is part of OpenLDAP Software . * @@ -783,7 +783,8 @@ syncprov_free_syncop( syncops *so ) GroupAssertion *ga, *gnext; ldap_pvt_thread_mutex_lock( &so->s_mutex ); - if ( --so->s_inuse > 0 ) { + /* already being freed, or still in use */ + if ( !so->s_inuse || --so->s_inuse > 0 ) { ldap_pvt_thread_mutex_unlock( &so->s_mutex ); return; } @@ -1293,6 +1294,7 @@ syncprov_matchops( Operation *op, opcook } if ( fc.fscope ) { + ldap_pvt_thread_mutex_lock( &ss->s_mutex ); op2 = *ss->s_op; oh = *op->o_hdr; oh.oh_conn = ss->s_op->o_conn; @@ -1301,7 +1303,6 @@ syncprov_matchops( Operation *op, opcook op2.o_hdr = &oh; op2.o_extra = op->o_extra; op2.o_callback = NULL; - ldap_pvt_thread_mutex_lock( &ss->s_mutex ); if (ss->s_flags & PS_FIX_FILTER) { /* Skip the AND/GE clause that we stuck on in front. We would lose deletes/mods that happen during the refresh @@ -2606,10 +2607,14 @@ shortcut: #endif ber_dupbv_x( &fava->f_ava->aa_value, &mincsn, op->o_tmpmemctx ); fava->f_next = op->ors_filter; + if ( sop ) + ldap_pvt_thread_mutex_lock( &sop->s_mutex ); op->ors_filter = fand; filter2bv_x( op, op->ors_filter, &op->ors_filterstr ); - if ( sop ) + if ( sop ) { sop->s_flags |= PS_FIX_FILTER; + ldap_pvt_thread_mutex_unlock( &sop->s_mutex ); + } } /* Let our callback add needed info to returned entries */ @@ -3015,6 +3020,9 @@ syncprov_db_close( { slap_overinst *on = (slap_overinst *) be->bd_info; syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; +#ifdef SLAP_CONFIG_DELETE + syncops *so, *sonext; +#endif /* SLAP_CONFIG_DELETE */ if ( slapMode & SLAP_TOOL_MODE ) { return 0; @@ -3035,6 +3043,20 @@ syncprov_db_close( syncprov_checkpoint( op, &rs, on ); } +#ifdef SLAP_CONFIG_DELETE + ldap_pvt_thread_mutex_lock( &si->si_ops_mutex ); + for ( so=si->si_ops, sonext=so; so; so=sonext ) { + SlapReply rs = {REP_RESULT}; + rs.sr_err = LDAP_UNAVAILABLE; + send_ldap_result( so->s_op, &rs ); + sonext=so->s_next; + syncprov_drop_psearch( so, 0); + } + si->si_ops=NULL; + ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex ); + overlay_unregister_control( be, LDAP_CONTROL_SYNC ); +#endif /* SLAP_CONFIG_DELETE */ + return 0; }