Diff for /servers/slapd/overlays/syncprov.c between versions 1.250 and 1.261

version 1.250, 2008/11/02 14:26:25 version 1.261, 2009/02/15 23:12:38
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.249 2008/10/28 19:33:46 rein Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.260 2009/02/15 22:21:28 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/>.
  *   *
  * Copyright 2004-2008 The OpenLDAP Foundation.   * Copyright 2004-2009 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 28 Line 28
 #include "config.h"  #include "config.h"
 #include "ldap_rq.h"  #include "ldap_rq.h"
   
   #ifdef LDAP_DEVEL
   #define CHECK_CSN       1
   #endif
   
 /* A modify request on a particular entry */  /* A modify request on a particular entry */
 typedef struct modinst {  typedef struct modinst {
         struct modinst *mi_next;          struct modinst *mi_next;
Line 704  again: Line 708  again:
         switch( mode ) {          switch( mode ) {
         case FIND_MAXCSN:          case FIND_MAXCSN:
                 if ( ber_bvcmp( &si->si_ctxcsn[maxid], &maxcsn )) {                  if ( ber_bvcmp( &si->si_ctxcsn[maxid], &maxcsn )) {
   #ifdef CHECK_CSN
                           Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
                           assert( !syn->ssyn_validate( syn, &maxcsn ));
   #endif
                         ber_bvreplace( &si->si_ctxcsn[maxid], &maxcsn );                          ber_bvreplace( &si->si_ctxcsn[maxid], &maxcsn );
                         si->si_numops++;        /* ensure a checkpoint */                          si->si_numops++;        /* ensure a checkpoint */
                 }                  }
Line 800  syncprov_sendresp( Operation *op, opcook Line 808  syncprov_sendresp( Operation *op, opcook
                 rs.sr_entry = *e;                  rs.sr_entry = *e;
                 if ( rs.sr_entry->e_private )                  if ( rs.sr_entry->e_private )
                         rs.sr_flags = REP_ENTRY_MUSTRELEASE;                          rs.sr_flags = REP_ENTRY_MUSTRELEASE;
                 if ( opc->sreference ) {                  if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {
                         rs.sr_ref = get_entry_referrals( op, rs.sr_entry );                          rs.sr_ref = get_entry_referrals( op, rs.sr_entry );
                         rs.sr_err = send_search_reference( op, &rs );                          rs.sr_err = send_search_reference( op, &rs );
                         ber_bvarray_free( rs.sr_ref );                          ber_bvarray_free( rs.sr_ref );
Line 823  syncprov_sendresp( Operation *op, opcook Line 831  syncprov_sendresp( Operation *op, opcook
                 e_uuid.e_name = opc->sdn;                  e_uuid.e_name = opc->sdn;
                 e_uuid.e_nname = opc->sndn;                  e_uuid.e_nname = opc->sndn;
                 rs.sr_entry = &e_uuid;                  rs.sr_entry = &e_uuid;
                 if ( opc->sreference ) {                  if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {
                         struct berval bv = BER_BVNULL;                          struct berval bv = BER_BVNULL;
                         rs.sr_ref = &bv;                          rs.sr_ref = &bv;
                         rs.sr_err = send_search_reference( op, &rs );                          rs.sr_err = send_search_reference( op, &rs );
Line 1259  syncprov_matchops( Operation *op, opcook Line 1267  syncprov_matchops( Operation *op, opcook
                         /* send DELETE */                          /* send DELETE */
                         syncprov_qresp( opc, ss, LDAP_SYNC_DELETE );                          syncprov_qresp( opc, ss, LDAP_SYNC_DELETE );
                 }                  }
                   if ( !saveit && found ) {
                           /* Decrement s_inuse, was incremented when called
                            * with saveit == TRUE
                            */
                           syncprov_free_syncop( ss );
                   }
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
   
Line 1333  syncprov_checkpoint( Operation *op, Slap Line 1347  syncprov_checkpoint( Operation *op, Slap
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
         slap_callback cb = {0};          slap_callback cb = {0};
         BackendDB be;          BackendDB be;
   #ifdef CHECK_CSN
           Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
   
           int i;
           for ( i=0; i<si->si_numcsns; i++ ) {
                   assert( !syn->ssyn_validate( syn, si->si_ctxcsn+i ));
           }
   #endif
         mod.sml_numvals = si->si_numcsns;          mod.sml_numvals = si->si_numcsns;
         mod.sml_values = si->si_ctxcsn;          mod.sml_values = si->si_ctxcsn;
         mod.sml_nvalues = NULL;          mod.sml_nvalues = NULL;
Line 1361  syncprov_checkpoint( Operation *op, Slap Line 1382  syncprov_checkpoint( Operation *op, Slap
         if ( mod.sml_next != NULL ) {          if ( mod.sml_next != NULL ) {
                 slap_mods_free( mod.sml_next, 1 );                  slap_mods_free( mod.sml_next, 1 );
         }          }
   #ifdef CHECK_CSN
           for ( i=0; i<si->si_numcsns; i++ ) {
                   assert( !syn->ssyn_validate( syn, si->si_ctxcsn+i ));
           }
   #endif
 }  }
   
 static void  static void
Line 1602  syncprov_op_response( Operation *op, Sla Line 1628  syncprov_op_response( Operation *op, Sla
   
         if ( rs->sr_err == LDAP_SUCCESS )          if ( rs->sr_err == LDAP_SUCCESS )
         {          {
                 struct berval maxcsn = BER_BVNULL;                  struct berval maxcsn;
                 char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];                  char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
                 int do_check = 0, have_psearches, foundit;                  int do_check = 0, have_psearches, foundit;
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
                   maxcsn.bv_val = cbuf;
                   maxcsn.bv_len = sizeof(cbuf);
                 ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );                  ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
                 slap_get_commit_csn( op, &maxcsn, &foundit );                  slap_get_commit_csn( op, &maxcsn, &foundit );
                 if ( BER_BVISNULL( &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
                          * it is configured , not where the changes are made.                           * it is configured , not where the changes are made.
                          * So look for a value in the glue db if we didn't                           * So look for a value in the glue db if we didn't
Line 1618  syncprov_op_response( Operation *op, Sla Line 1646  syncprov_op_response( Operation *op, Sla
                          */                           */
                         BackendDB *be = op->o_bd;                          BackendDB *be = op->o_bd;
                         op->o_bd = select_backend( &be->be_nsuffix[0], 1);                          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 );                          slap_get_commit_csn( op, &maxcsn, &foundit );
                         op->o_bd = be;                          op->o_bd = be;
                 }                  }
                 if ( !BER_BVISNULL( &maxcsn ) ) {                  if ( !BER_BVISEMPTY( &maxcsn ) ) {
                         int i, sid;                          int i, sid;
                         strcpy( cbuf, maxcsn.bv_val );  #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 );                          sid = slap_parse_csn_sid( &maxcsn );
                         for ( i=0; i<si->si_numcsns; i++ ) {                          for ( i=0; i<si->si_numcsns; i++ ) {
                                 if ( sid == si->si_sids[i] ) {                                  if ( sid == si->si_sids[i] ) {
Line 1648  syncprov_op_response( Operation *op, Sla Line 1681  syncprov_op_response( Operation *op, Sla
                 }                  }
   
                 /* Don't do any processing for consumer contextCSN updates */                  /* Don't do any processing for consumer contextCSN updates */
                 if ( SLAP_SYNC_SHADOW( op->o_bd ) &&                   if ( op->o_dont_replicate ) {
                         op->o_msgid == SLAP_SYNC_UPDATE_MSGID ) {  
                         ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );                          ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
                         return SLAP_CB_CONTINUE;                          return SLAP_CB_CONTINUE;
                 }                  }
Line 1680  syncprov_op_response( Operation *op, Sla Line 1712  syncprov_op_response( Operation *op, Sla
   
                 /* only update consumer ctx if this is the greatest csn */                  /* only update consumer ctx if this is the greatest csn */
                 if ( bvmatch( &maxcsn, &op->o_csn )) {                  if ( bvmatch( &maxcsn, &op->o_csn )) {
                         opc->sctxcsn.bv_len = maxcsn.bv_len;                          opc->sctxcsn = maxcsn;
                         opc->sctxcsn.bv_val = cbuf;  
                 }                  }
   
                 /* Handle any persistent searches */                  /* Handle any persistent searches */
Line 1745  syncprov_op_compare( Operation *op, Slap Line 1776  syncprov_op_compare( Operation *op, Slap
   
                 a.a_vals = si->si_ctxcsn;                  a.a_vals = si->si_ctxcsn;
                 a.a_nvals = a.a_vals;                  a.a_nvals = a.a_vals;
                   a.a_numvals = si->si_numcsns;
   
                 rs->sr_err = access_allowed( op, &e, op->oq_compare.rs_ava->aa_desc,                  rs->sr_err = access_allowed( op, &e, op->oq_compare.rs_ava->aa_desc,
                         &op->oq_compare.rs_ava->aa_value, ACL_COMPARE, NULL );                          &op->oq_compare.rs_ava->aa_value, ACL_COMPARE, NULL );
Line 1944  syncprov_detach_op( Operation *op, synco Line 1976  syncprov_detach_op( Operation *op, synco
         op2->o_time = op->o_time;          op2->o_time = op->o_time;
         op2->o_bd = on->on_info->oi_origdb;          op2->o_bd = on->on_info->oi_origdb;
         op2->o_request = op->o_request;          op2->o_request = op->o_request;
           op2->o_managedsait = op->o_managedsait;
         LDAP_SLIST_FIRST(&op2->o_extra)->oe_key = on;          LDAP_SLIST_FIRST(&op2->o_extra)->oe_key = on;
         LDAP_SLIST_NEXT(LDAP_SLIST_FIRST(&op2->o_extra), oe_next) = NULL;          LDAP_SLIST_NEXT(LDAP_SLIST_FIRST(&op2->o_extra), oe_next) = NULL;
   
Line 2117  syncprov_search_response( Operation *op, Line 2150  syncprov_search_response( Operation *op,
                                 op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );                                  op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
   
                         /* Detach this Op from frontend control */                          /* Detach this Op from frontend control */
                         ldap_pvt_thread_mutex_lock( &ss->ss_so->s_mutex );  
                         ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );                          ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
   
                         /* But not if this connection was closed along the way */                          /* But not if this connection was closed along the way */
                         if ( op->o_abandon ) {                          if ( op->o_abandon ) {
                                 ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );                                  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_ab_cleanup will free this syncop */
                                 return SLAPD_ABANDON;                                  return SLAPD_ABANDON;
   
                         } else {                          } else {
                                   ldap_pvt_thread_mutex_lock( &ss->ss_so->s_mutex );
                                 /* Turn off the refreshing flag */                                  /* Turn off the refreshing flag */
                                 ss->ss_so->s_flags ^= PS_IS_REFRESHING;                                  ss->ss_so->s_flags ^= PS_IS_REFRESHING;
   
Line 2138  syncprov_search_response( Operation *op, Line 2170  syncprov_search_response( Operation *op,
                                 /* If there are queued responses, fire them off */                                  /* If there are queued responses, fire them off */
                                 if ( ss->ss_so->s_res )                                  if ( ss->ss_so->s_res )
                                         syncprov_qstart( ss->ss_so );                                          syncprov_qstart( ss->ss_so );
                                   ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex );
                         }                          }
                         ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex );  
   
                         return LDAP_SUCCESS;                          return LDAP_SUCCESS;
                 }                  }
Line 2170  syncprov_op_search( Operation *op, SlapR Line 2202  syncprov_op_search( Operation *op, SlapR
         }          }
   
         srs = op->o_controls[slap_cids.sc_LDAPsync];          srs = op->o_controls[slap_cids.sc_LDAPsync];
         op->o_managedsait = SLAP_CONTROL_NONCRITICAL;  
   
         /* If this is a persistent search, set it up right away */          /* If this is a persistent search, set it up right away */
         if ( op->o_sync_mode & SLAP_SYNC_PERSIST ) {          if ( op->o_sync_mode & SLAP_SYNC_PERSIST ) {
Line 2733  syncprov_db_open( Line 2764  syncprov_db_open(
                         si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, a->a_numvals, NULL );                          si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, a->a_numvals, NULL );
                 }                  }
                 overlay_entry_release_ov( op, e, 0, on );                  overlay_entry_release_ov( op, e, 0, on );
                 if ( si->si_ctxcsn ) {                  if ( si->si_ctxcsn && !SLAP_DBCLEAN( be )) {
                         op->o_req_dn = be->be_suffix[0];                          op->o_req_dn = be->be_suffix[0];
                         op->o_req_ndn = be->be_nsuffix[0];                          op->o_req_ndn = be->be_nsuffix[0];
                         op->ors_scope = LDAP_SCOPE_SUBTREE;                          op->ors_scope = LDAP_SCOPE_SUBTREE;

Removed from v.1.250  
changed lines
  Added in v.1.261


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