Diff for /servers/slapd/overlays/syncprov.c between versions 1.300 and 1.301

version 1.300, 2009/11/21 02:38:13 version 1.301, 2009/11/21 10:43:01
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.298 2009/11/19 10:17:53 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.300 2009/11/21 02:38:13 hyc 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 1671  syncprov_op_response( Operation *op, Sla Line 1671  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->o_tag == LDAP_REQ_MODIFY &&                  if ( BER_BVISEMPTY( &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);
                           maxcsn.bv_val = cbuf;
                           maxcsn.bv_len = sizeof(cbuf);
                           slap_get_commit_csn( op, &maxcsn, &foundit );
                           op->o_bd = be;
                   }
                   if ( !BER_BVISEMPTY( &maxcsn ) ) {
                           int i, sid;
   #ifdef CHECK_CSN
                           Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
                           assert( !syn->ssyn_validate( syn, &maxcsn ));
   #endif
                           sid = slap_parse_csn_sid( &maxcsn );
                           for ( i=0; i<si->si_numcsns; i++ ) {
                                   if ( sid == si->si_sids[i] ) {
                                           if ( ber_bvcmp( &maxcsn, &si->si_ctxcsn[i] ) > 0 ) {
                                                   ber_bvreplace( &si->si_ctxcsn[i], &maxcsn );
                                                   csn_changed = 1;
                                           }
                                           break;
                                   }
                           }
                           /* It's a new SID for us */
                           if ( i == si->si_numcsns ) {
                                   value_add_one( &si->si_ctxcsn, &maxcsn );
                                   csn_changed = 1;
                                   si->si_numcsns++;
                                   si->si_sids = ch_realloc( si->si_sids, si->si_numcsns *
                                           sizeof(int));
                                   si->si_sids[i] = sid;
                           }
                   }
   
                   /* Don't do any processing for consumer contextCSN updates */
                   if ( op->o_dont_replicate ) {
                           if ( op->o_tag == LDAP_REQ_MODIFY &&
                                 op->orm_modlist->sml_op == LDAP_MOD_REPLACE &&                                  op->orm_modlist->sml_op == LDAP_MOD_REPLACE &&
                                 op->orm_modlist->sml_desc == slap_schema.si_ad_contextCSN ) {                                  op->orm_modlist->sml_desc == slap_schema.si_ad_contextCSN ) {
                         /* Catch contextCSN updates from syncrepl. We have to look at                          /* Catch contextCSN updates from syncrepl. We have to look at
Line 1683  syncprov_op_response( Operation *op, Sla Line 1725  syncprov_op_response( Operation *op, Sla
   
                         for ( i=0; i<mod->sml_numvals; i++ ) {                          for ( i=0; i<mod->sml_numvals; i++ ) {
                                 sid = slap_parse_csn_sid( &mod->sml_values[i] );                                  sid = slap_parse_csn_sid( &mod->sml_values[i] );
   
                                 for ( j=0; j<si->si_numcsns; j++ ) {                                  for ( j=0; j<si->si_numcsns; j++ ) {
                                         if ( sid == si->si_sids[j] ) {                                          if ( sid == si->si_sids[j] ) {
                                                 if ( ber_bvcmp( &mod->sml_values[i], &si->si_ctxcsn[j] ) > 0 ) {                                                  if ( ber_bvcmp( &mod->sml_values[i], &si->si_ctxcsn[j] ) > 0 ) {
Line 1718  syncprov_op_response( Operation *op, Sla Line 1759  syncprov_op_response( Operation *op, Sla
                                         }                                          }
                                 }                                  }
                         }                          }
                         goto leave;                          } else {
                 }  
   
                 slap_get_commit_csn( op, &maxcsn, &foundit );  
                 if ( BER_BVISEMPTY( &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);  
                         maxcsn.bv_val = cbuf;  
                         maxcsn.bv_len = sizeof(cbuf);  
                         slap_get_commit_csn( op, &maxcsn, &foundit );  
                         op->o_bd = be;  
                 }  
                 if ( !BER_BVISEMPTY( &maxcsn ) ) {  
                         int i, sid;  
 #ifdef CHECK_CSN  
                         Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;  
                         assert( !syn->ssyn_validate( syn, &maxcsn ));  
 #endif  
                         sid = slap_parse_csn_sid( &maxcsn );  
                         for ( i=0; i<si->si_numcsns; i++ ) {  
                                 if ( sid == si->si_sids[i] ) {  
                                         if ( ber_bvcmp( &maxcsn, &si->si_ctxcsn[i] ) > 0 ) {  
                                                 ber_bvreplace( &si->si_ctxcsn[i], &maxcsn );  
                                                 csn_changed = 1;  
                                         }  
                                         break;  
                                 }  
                         }  
                         /* It's a new SID for us */  
                         if ( i == si->si_numcsns ) {  
                                 value_add_one( &si->si_ctxcsn, &maxcsn );  
                                 csn_changed = 1;  
                                 si->si_numcsns++;  
                                 si->si_sids = ch_realloc( si->si_sids, si->si_numcsns *  
                                         sizeof(int));  
                                 si->si_sids[i] = sid;  
                         }  
 #if 0  
                 } else if ( !foundit ) {  
                         /* internal ops that aren't meant to be replicated */  
                         ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );  
                         return SLAP_CB_CONTINUE;  
 #endif  
                 }  
   
                 /* Don't do any processing for consumer contextCSN updates */  
                 if ( op->o_dont_replicate ) {  
                         ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );                          ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
                           }
                         goto leave;                          goto leave;
                 }                  }
   

Removed from v.1.300  
changed lines
  Added in v.1.301


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