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

version 1.147.2.48, 2009/03/05 20:23:15 version 1.147.2.49, 2009/03/12 23:28:52
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.47 2009/03/05 20:20:47 quanah Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.48 2009/03/05 20:23:15 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 1659  syncprov_op_response( Operation *op, Sla Line 1659  syncprov_op_response( Operation *op, Sla
                 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.48  
changed lines
  Added in v.1.147.2.49


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