Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.47 and 1.147.2.48

version 1.147.2.47, 2009/03/05 20:20:47 version 1.147.2.48, 2009/03/05 20:23:15
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.46 2009/02/23 02:15:32 quanah Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.47 2009/03/05 20:20:47 quanah Exp $ */
 /* syncprov.c - syncrepl provider */  /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
Line 1658  syncprov_op_response( Operation *op, Sla Line 1658  syncprov_op_response( Operation *op, Sla
                 maxcsn.bv_val = cbuf;                  maxcsn.bv_val = cbuf;
                 maxcsn.bv_len = sizeof(cbuf);                  maxcsn.bv_len = sizeof(cbuf);
                 ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );                  ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
   
                   if ( op->o_dont_replicate &&
                                   op->orm_modlist->sml_op == LDAP_MOD_REPLACE &&
                                   op->orm_modlist->sml_desc == slap_schema.si_ad_contextCSN ) {
                           /* Catch contextCSN updates from syncrepl. We have to look at
                            * all the attribute values, as there may be more than one csn
                            * that changed, and only one can be passed in the csn queue.
                            */
                           Modifications *mod = op->orm_modlist;
                           int i, j, sid;
   
                           for ( i=0; i<mod->sml_numvals; i++ ) {
                                   sid = slap_parse_csn_sid( &mod->sml_values[i] );
   
                                   for ( j=0; j<si->si_numcsns; j++ ) {
                                           if ( sid == si->si_sids[j] ) {
                                                   if ( ber_bvcmp( &mod->sml_values[i], &si->si_ctxcsn[j] ) > 0 ) {
                                                           ber_bvreplace( &si->si_ctxcsn[j], &mod->sml_values[i] );
                                                           csn_changed = 1;
                                                   }
                                                   break;
                                           }
                                   }
   
                                   if ( j == si->si_numcsns ) {
                                           value_add_one( &si->si_ctxcsn, &mod->sml_values[i] );
                                           si->si_numcsns++;
                                           si->si_sids = ch_realloc( si->si_sids, si->si_numcsns *
                                                   sizeof(int));
                                           si->si_sids[j] = sid;
                                           csn_changed = 1;
                                   }
                           }
                           ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
   
                           if ( csn_changed ) {
                                   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 ) {
                                           for ( sm = opc->smatches; sm; sm=sm->sm_next ) {
                                                   if ( sm->sm_op->s_op->o_abandon )
                                                           continue;
                                                   syncprov_qresp( opc, sm->sm_op, LDAP_SYNC_NEW_COOKIE );
                                           }
                                   }
                           }
                           return SLAP_CB_CONTINUE;
                   }
   
                 slap_get_commit_csn( op, &maxcsn, &foundit );                  slap_get_commit_csn( op, &maxcsn, &foundit );
                 if ( BER_BVISEMPTY( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) {                  if ( BER_BVISEMPTY( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) {
                         /* syncrepl queues the CSN values in the db where                          /* syncrepl queues the CSN values in the db where

Removed from v.1.147.2.47  
changed lines
  Added in v.1.147.2.48


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org