Diff for /servers/slapd/overlays/syncprov.c between versions 1.247 and 1.259

version 1.247, 2008/09/16 12:44:25 version 1.259, 2009/02/15 22:17:45
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.246 2008/07/04 21:44:39 rein Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.258 2009/02/15 22:14:25 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 627  again: Line 627  again:
                 cf.f_av_value = si->si_ctxcsn[maxid];                  cf.f_av_value = si->si_ctxcsn[maxid];
                 fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),                  fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),
                         "(entryCSN>=%s)", cf.f_av_value.bv_val );                          "(entryCSN>=%s)", cf.f_av_value.bv_val );
                 if ( fop.ors_filterstr.bv_len < 0 || fop.ors_filterstr.bv_len >= sizeof( buf ) ) {                  if ( fop.ors_filterstr.bv_len >= sizeof( buf ) ) {
                         return LDAP_OTHER;                          return LDAP_OTHER;
                 }                  }
                 fop.ors_attrsonly = 0;                  fop.ors_attrsonly = 0;
Line 664  again: Line 664  again:
                         fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),                          fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),
                                 "(entryCSN<=%s)", cf.f_av_value.bv_val );                                  "(entryCSN<=%s)", cf.f_av_value.bv_val );
                 }                  }
                 if ( fop.ors_filterstr.bv_len < 0 || fop.ors_filterstr.bv_len >= sizeof( buf ) ) {                  if ( fop.ors_filterstr.bv_len >= sizeof( buf ) ) {
                         return LDAP_OTHER;                          return LDAP_OTHER;
                 }                  }
                 fop.ors_attrsonly = 1;                  fop.ors_attrsonly = 1;
Line 704  again: Line 704  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 804  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 827  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 908  syncprov_qplay( Operation *op, struct re Line 912  syncprov_qplay( Operation *op, struct re
         } else {          } else {
                 /* bail out on any error */                  /* bail out on any error */
                 ldap_pvt_runqueue_remove( &slapd_rq, rtask );                  ldap_pvt_runqueue_remove( &slapd_rq, rtask );
   
                   /* Prevent duplicate remove */
                   if ( so->s_qtask == rtask )
                           so->s_qtask = NULL;
         }          }
         ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );          ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
         ldap_pvt_thread_mutex_unlock( &so->s_mutex );          ldap_pvt_thread_mutex_unlock( &so->s_mutex );
Line 1255  syncprov_matchops( Operation *op, opcook Line 1263  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 1329  syncprov_checkpoint( Operation *op, Slap Line 1343  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 1357  syncprov_checkpoint( Operation *op, Slap Line 1378  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 1600  syncprov_op_response( Operation *op, Sla Line 1626  syncprov_op_response( Operation *op, Sla
         {          {
                 struct berval maxcsn = BER_BVNULL;                  struct berval maxcsn = BER_BVNULL;
                 char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];                  char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
                 int do_check = 0, have_psearches;                  int do_check = 0, have_psearches, foundit;
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
                 ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );                  ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
                 slap_get_commit_csn( op, &maxcsn );                  slap_get_commit_csn( op, &maxcsn, &foundit );
                 if ( BER_BVISNULL( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) {                  if ( BER_BVISNULL( &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.
Line 1614  syncprov_op_response( Operation *op, Sla Line 1640  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);
                         slap_get_commit_csn( op, &maxcsn );                          slap_get_commit_csn( op, &maxcsn, &foundit );
                         op->o_bd = be;                          op->o_bd = be;
                 }                  }
                 if ( !BER_BVISNULL( &maxcsn ) ) {                  if ( !BER_BVISNULL( &maxcsn ) ) {
                         int i, sid;                          int i, sid;
   #ifdef CHECK_CSN
                           Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
                           assert( !syn->ssyn_validate( syn, &maxcsn ));
   #endif
                         strcpy( cbuf, maxcsn.bv_val );                          strcpy( cbuf, maxcsn.bv_val );
                         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++ ) {
Line 1637  syncprov_op_response( Operation *op, Sla Line 1667  syncprov_op_response( Operation *op, Sla
                                         sizeof(int));                                          sizeof(int));
                                 si->si_sids[i] = sid;                                  si->si_sids[i] = sid;
                         }                          }
                 } else {                  } else if ( !foundit ) {
                         /* internal ops that aren't meant to be replicated */                          /* internal ops that aren't meant to be replicated */
                         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;
                 }                  }
   
                 /* 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 1674  syncprov_op_response( Operation *op, Sla Line 1703  syncprov_op_response( Operation *op, Sla
                         ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );                          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
   
                 opc->sctxcsn.bv_len = maxcsn.bv_len;                  /* only update consumer ctx if this is the greatest csn */
                 opc->sctxcsn.bv_val = cbuf;                  if ( bvmatch( &maxcsn, &op->o_csn )) {
                           opc->sctxcsn.bv_len = maxcsn.bv_len;
                           opc->sctxcsn.bv_val = cbuf;
                   }
   
                 /* Handle any persistent searches */                  /* Handle any persistent searches */
                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );                  ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
Line 1738  syncprov_op_compare( Operation *op, Slap Line 1770  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 1937  syncprov_detach_op( Operation *op, synco Line 1970  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 2110  syncprov_search_response( Operation *op, Line 2144  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 2131  syncprov_search_response( Operation *op, Line 2164  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 2163  syncprov_op_search( Operation *op, SlapR Line 2196  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 2532  sp_cf_gen(ConfigArgs *c) Line 2564  sp_cf_gen(ConfigArgs *c)
                                 struct berval bv;                                  struct berval bv;
                                 bv.bv_len = snprintf( c->cr_msg, sizeof( c->cr_msg ),                                  bv.bv_len = snprintf( c->cr_msg, sizeof( c->cr_msg ),
                                         "%d %d", si->si_chkops, si->si_chktime );                                          "%d %d", si->si_chkops, si->si_chktime );
                                 if ( bv.bv_len < 0 || bv.bv_len >= sizeof( c->cr_msg ) ) {                                  if ( bv.bv_len >= sizeof( c->cr_msg ) ) {
                                         rc = 1;                                          rc = 1;
                                 } else {                                  } else {
                                         bv.bv_val = c->cr_msg;                                          bv.bv_val = c->cr_msg;
Line 2726  syncprov_db_open( Line 2758  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.247  
changed lines
  Added in v.1.259


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