--- servers/slapd/overlays/syncprov.c 2008/05/29 15:02:45 1.147.2.28 +++ servers/slapd/overlays/syncprov.c 2008/03/19 23:31:42 1.223 @@ -1,4 +1,4 @@ -/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.27 2008/05/28 16:35:32 quanah Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.222 2008/03/19 23:26:14 hyc Exp $ */ /* syncprov.c - syncrepl provider */ /* This work is part of OpenLDAP Software . * @@ -404,6 +404,7 @@ syncprov_findbase( Operation *op, fbase_ slap_callback cb = {0}; Operation fop; SlapReply frs = { REP_RESULT }; + BackendInfo *bi; int rc; fc->fss->s_flags ^= PS_FIND_BASE; @@ -411,10 +412,11 @@ syncprov_findbase( Operation *op, fbase_ fop = *fc->fss->s_op; - fop.o_bd = fop.o_bd->bd_self; fop.o_hdr = op->o_hdr; + fop.o_bd = op->o_bd; fop.o_time = op->o_time; fop.o_tincr = op->o_tincr; + bi = op->o_bd->bd_info; cb.sc_response = findbase_cb; cb.sc_private = fc; @@ -432,7 +434,8 @@ syncprov_findbase( Operation *op, fbase_ fop.ors_filter = &generic_filter; fop.ors_filterstr = generic_filterstr; - rc = fop.o_bd->be_search( &fop, &frs ); + rc = overlay_op_walk( &fop, &frs, op_search, on->on_info, on ); + op->o_bd->bd_info = bi; } else { ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex ); fc->fbase = 1; @@ -693,7 +696,10 @@ again: break; } - fop.o_bd->bd_info = (BackendInfo *)on->on_info; + if ( on->on_next ) + fop.o_bd->bd_info = (BackendInfo *)on->on_next; + else + fop.o_bd->bd_info = on->on_info->oi_orig; fop.o_bd->be_search( &fop, &frs ); fop.o_bd->bd_info = (BackendInfo *)on; @@ -734,13 +740,6 @@ syncprov_free_syncop( syncops *so ) ldap_pvt_thread_mutex_unlock( &so->s_mutex ); return; } - if ( so->s_qtask ) { - ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); - if ( ldap_pvt_runqueue_isrunning( &slapd_rq, so->s_qtask ) ) - ldap_pvt_runqueue_stoptask( &slapd_rq, so->s_qtask ); - ldap_pvt_runqueue_remove( &slapd_rq, so->s_qtask ); - ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); - } ldap_pvt_thread_mutex_unlock( &so->s_mutex ); if ( so->s_flags & PS_IS_DETACHED ) { filter_free( so->s_op->ors_filter ); @@ -1173,14 +1172,10 @@ syncprov_matchops( Operation *op, opcook for (ss = si->si_ops, sprev = (syncops *)&si->si_ops; ss; sprev = ss, ss=snext) { - Operation op2; syncmatches *sm; int found = 0; snext = ss->s_next; - if ( ss->s_op->o_abandon ) - continue; - /* validate base */ fc.fss = ss; fc.fbase = 0; @@ -1221,14 +1216,8 @@ syncprov_matchops( Operation *op, opcook } } - if ( fc.fscope ) { - op2 = *ss->s_op; - op2.o_hdr = op->o_hdr; - op2.o_extra = op->o_extra; - } - /* check if current o_req_dn is in scope and matches filter */ - if ( fc.fscope && test_filter( &op2, e, ss->s_op->ors_filter ) == + if ( fc.fscope && test_filter( ss->s_op, e, ss->s_op->ors_filter ) == LDAP_COMPARE_TRUE ) { if ( saveit ) { sm = op->o_tmpalloc( sizeof(syncmatches), op->o_tmpmemctx ); @@ -1542,7 +1531,10 @@ syncprov_playlog( Operation *op, SlapRep fop.ors_filter = ⁡ cb.sc_response = playlog_cb; - fop.o_bd->bd_info = (BackendInfo *)on->on_info; + if ( on->on_next ) + fop.o_bd->bd_info = (BackendInfo *)on->on_next; + else + fop.o_bd->bd_info = on->on_info->oi_orig; for ( i=ndel; isr_state.rid, - srs->sr_state.sid ); - } + slap_compose_sync_cookie( op, &cookie, delcsn, srs->sr_state.rid, + srs->sr_state.sid ); Debug( LDAP_DEBUG_SYNC, "syncprov_playlog: cookie=%s\n", cookie.bv_val, 0, 0 ); uuids[ndel].bv_val = NULL; - syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, - delcsn[0].bv_len ? &cookie : NULL, 0, uuids, 1 ); + syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 ); op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx ); } op->o_tmpfree( uuids, op->o_tmpmemctx ); @@ -1596,17 +1585,6 @@ syncprov_op_response( Operation *op, Sla cbuf[0] = '\0'; ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock ); slap_get_commit_csn( op, &maxcsn ); - if ( BER_BVISNULL( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) { - /* syncrepl queues the CSN values in the db where - * it is configured , not where the changes are made. - * So look for a value in the glue db if we didn't - * find any in this db. - */ - BackendDB *be = op->o_bd; - op->o_bd = select_backend( &be->be_nsuffix[0], 1); - slap_get_commit_csn( op, &maxcsn ); - op->o_bd = be; - } if ( !BER_BVISNULL( &maxcsn ) ) { int i, sid; strcpy( cbuf, maxcsn.bv_val ); @@ -1627,10 +1605,6 @@ syncprov_op_response( Operation *op, Sla sizeof(int)); si->si_sids[i] = sid; } - } else { - /* internal ops that aren't meant to be replicated */ - ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock ); - return SLAP_CB_CONTINUE; } /* Don't do any processing for consumer contextCSN updates */ @@ -1993,7 +1967,6 @@ syncprov_search_response( Operation *op, { searchstate *ss = op->o_callback->sc_private; slap_overinst *on = ss->ss_on; - syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; sync_control *srs = op->o_controls[slap_cids.sc_LDAPsync]; if ( rs->sr_type == REP_SEARCH || rs->sr_type == REP_SEARCHREF ) { @@ -2059,16 +2032,8 @@ syncprov_search_response( Operation *op, rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2, op->o_tmpmemctx ); rs->sr_ctrls[1] = NULL; - /* If we're in delta-sync mode, always send a cookie */ - if ( si->si_nopres && si->si_usehint && a ) { - struct berval cookie; - slap_compose_sync_cookie( op, &cookie, a->a_nvals, srs->sr_state.rid, srs->sr_state.sid ); - rs->sr_err = syncprov_state_ctrl( op, rs, rs->sr_entry, - LDAP_SYNC_ADD, rs->sr_ctrls, 0, 1, &cookie ); - } else { - rs->sr_err = syncprov_state_ctrl( op, rs, rs->sr_entry, - LDAP_SYNC_ADD, rs->sr_ctrls, 0, 0, NULL ); - } + rs->sr_err = syncprov_state_ctrl( op, rs, rs->sr_entry, + LDAP_SYNC_ADD, rs->sr_ctrls, 0, 0, NULL ); } else if ( rs->sr_type == REP_RESULT && rs->sr_err == LDAP_SUCCESS ) { struct berval cookie; @@ -2107,7 +2072,7 @@ syncprov_search_response( Operation *op, if ( op->o_abandon ) { ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex ); - /* syncprov_ab_cleanup will free this syncop */ + syncprov_free_syncop( ss->ss_so ); return SLAPD_ABANDON; } else { @@ -2281,9 +2246,6 @@ no_change: if ( !(op->o_sync_mode & SLA } goto shortcut; } - } else { - /* consumer doesn't have the right number of CSNs */ - changed = SS_CHANGED; } /* Do we have a sessionlog for this search? */ sl=si->si_logs; @@ -2426,15 +2388,8 @@ syncprov_operational( } if ( !ap ) { - if ( !(rs->sr_flags & REP_ENTRY_MODIFIABLE) ) { - Entry *e = entry_dup( rs->sr_entry ); - if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) { - overlay_entry_release_ov( op, rs->sr_entry, 0, on ); - rs->sr_flags ^= REP_ENTRY_MUSTRELEASE; - } else if ( rs->sr_flags & REP_ENTRY_MUSTBEFREED ) { - entry_free( rs->sr_entry ); - } - rs->sr_entry = e; + if ( !rs->sr_flags & REP_ENTRY_MODIFIABLE ) { + rs->sr_entry = entry_dup( rs->sr_entry ); rs->sr_flags |= REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED; a = attr_find( rs->sr_entry->e_attrs,