Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.12 and 1.219

version 1.147.2.12, 2007/11/08 19:22:17 version 1.219, 2008/03/12 21:31:28
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.11 2007/10/18 01:35:12 quanah Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.218 2008/03/08 22:51:07 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-2007 The OpenLDAP Foundation.   * Copyright 2004-2008 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 624  again: Line 624  again:
                                 maxid = i;                                  maxid = i;
                         }                          }
                 }                  }
                 fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN>=%s)",                  fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),
                         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 ) ) {
                           return LDAP_OTHER;
                   }
                 fop.ors_attrsonly = 0;                  fop.ors_attrsonly = 0;
                 fop.ors_attrs = csn_anlist;                  fop.ors_attrs = csn_anlist;
                 fop.ors_slimit = SLAP_NO_LIMIT;                  fop.ors_slimit = SLAP_NO_LIMIT;
Line 649  again: Line 652  again:
                 /* Look for exact match the first time */                  /* Look for exact match the first time */
                 if ( findcsn_retry ) {                  if ( findcsn_retry ) {
                         cf.f_choice = LDAP_FILTER_EQUALITY;                          cf.f_choice = LDAP_FILTER_EQUALITY;
                         fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN=%s)",                          fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),
                                 cf.f_av_value.bv_val );                                  "(entryCSN=%s)", cf.f_av_value.bv_val );
                 /* On retry, look for <= */                  /* On retry, look for <= */
                 } else {                  } else {
                         cf.f_choice = LDAP_FILTER_LE;                          cf.f_choice = LDAP_FILTER_LE;
                         fop.ors_limit = &fc_limits;                          fop.ors_limit = &fc_limits;
                         memset( &fc_limits, 0, sizeof( fc_limits ));                          memset( &fc_limits, 0, sizeof( fc_limits ));
                         fc_limits.lms_s_unchecked = 1;                          fc_limits.lms_s_unchecked = 1;
                         fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)",                          fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),
                                 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 ) ) {
                           return LDAP_OTHER;
                 }                  }
                 fop.ors_attrsonly = 1;                  fop.ors_attrsonly = 1;
                 fop.ors_attrs = slap_anlist_no_attrs;                  fop.ors_attrs = slap_anlist_no_attrs;
Line 831  syncprov_sendresp( Operation *op, opcook Line 837  syncprov_sendresp( Operation *op, opcook
   
 /* Play back queued responses */  /* Play back queued responses */
 static int  static int
 syncprov_qplay( Operation *op, slap_overinst *on, syncops *so )  syncprov_qplay( Operation *op, struct re_s *rtask )
 {  {
           syncops *so = rtask->arg;
           slap_overinst *on = so->s_op->o_private;
         syncres *sr;          syncres *sr;
         Entry *e;          Entry *e;
         opcookie opc;          opcookie opc;
Line 847  syncprov_qplay( Operation *op, slap_over Line 855  syncprov_qplay( Operation *op, slap_over
                         so->s_res = sr->s_next;                          so->s_res = sr->s_next;
                 if ( !so->s_res )                  if ( !so->s_res )
                         so->s_restail = NULL;                          so->s_restail = NULL;
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  /* Exit loop with mutex held */
   
                 if ( !sr || so->s_op->o_abandon )                  if ( !sr || so->s_op->o_abandon )
                         break;                          break;
                   ldap_pvt_thread_mutex_unlock( &so->s_mutex );
   
                 opc.sdn = sr->s_dn;                  opc.sdn = sr->s_dn;
                 opc.sndn = sr->s_ndn;                  opc.sndn = sr->s_ndn;
Line 877  syncprov_qplay( Operation *op, slap_over Line 885  syncprov_qplay( Operation *op, slap_over
   
                 ch_free( sr );                  ch_free( sr );
   
                 if ( rc )                  if ( rc ) {
                           /* Exit loop with mutex held */
                           ldap_pvt_thread_mutex_lock( &so->s_mutex );
                         break;                          break;
                   }
           }
   
           /* wait until we get explicitly scheduled again */
           ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
           ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
           if ( rc == 0 ) {
                   ldap_pvt_runqueue_resched( &slapd_rq, rtask, 1 );
           } else {
                   /* bail out on any error */
                   ldap_pvt_runqueue_remove( &slapd_rq, rtask );
         }          }
           ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
           ldap_pvt_thread_mutex_unlock( &so->s_mutex );
         return rc;          return rc;
 }  }
   
Line 889  syncprov_qtask( void *ctx, void *arg ) Line 912  syncprov_qtask( void *ctx, void *arg )
 {  {
         struct re_s *rtask = arg;          struct re_s *rtask = arg;
         syncops *so = rtask->arg;          syncops *so = rtask->arg;
         slap_overinst *on = so->s_op->o_private;  
         OperationBuffer opbuf;          OperationBuffer opbuf;
         Operation *op;          Operation *op;
         BackendDB be;          BackendDB be;
Line 914  syncprov_qtask( void *ctx, void *arg ) Line 936  syncprov_qtask( void *ctx, void *arg )
         op->o_private = NULL;          op->o_private = NULL;
         op->o_callback = NULL;          op->o_callback = NULL;
   
         rc = syncprov_qplay( op, on, so );          rc = syncprov_qplay( op, rtask );
   
         /* decrement use count... */          /* decrement use count... */
         syncprov_free_syncop( so );          syncprov_free_syncop( so );
   
         /* wait until we get explicitly scheduled again */  
         ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );  
         ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );  
         if ( rc == 0 ) {  
                 ldap_pvt_runqueue_resched( &slapd_rq, rtask, 1 );  
         } else {  
                 /* bail out on any error */  
                 ldap_pvt_runqueue_remove( &slapd_rq, rtask );  
         }  
         ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );  
   
 #if 0   /* FIXME: connection_close isn't exported from slapd.  #if 0   /* FIXME: connection_close isn't exported from slapd.
                  * should it be?                   * should it be?
                  */                   */
Line 1203  syncprov_matchops( Operation *op, opcook Line 1214  syncprov_matchops( Operation *op, opcook
                 }                  }
   
                 /* check if current o_req_dn is in scope and matches filter */                  /* check if current o_req_dn is in scope and matches filter */
                 if ( fc.fscope && test_filter( op, e, ss->s_op->ors_filter ) ==                  if ( fc.fscope && test_filter( ss->s_op, e, ss->s_op->ors_filter ) ==
                         LDAP_COMPARE_TRUE ) {                          LDAP_COMPARE_TRUE ) {
                         if ( saveit ) {                          if ( saveit ) {
                                 sm = op->o_tmpalloc( sizeof(syncmatches), op->o_tmpmemctx );                                  sm = op->o_tmpalloc( sizeof(syncmatches), op->o_tmpmemctx );
Line 1601  syncprov_op_response( Operation *op, Sla Line 1612  syncprov_op_response( Operation *op, Sla
                         }                          }
                         if ( si->si_chktime &&                          if ( si->si_chktime &&
                                 (op->o_time - si->si_chklast >= si->si_chktime )) {                                  (op->o_time - si->si_chklast >= si->si_chktime )) {
                                 do_check = 1;                                  if ( si->si_chklast ) {
                                 si->si_chklast = op->o_time;                                          do_check = 1;
                                           si->si_chklast = op->o_time;
                                   } else {
                                           si->si_chklast = 1;
                                   }
                         }                          }
                 }                  }
                 ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );                  ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
Line 1765  syncprov_op_mod( Operation *op, SlapRepl Line 1780  syncprov_op_mod( Operation *op, SlapRepl
                         /* wait for this op to get to head of list */                          /* wait for this op to get to head of list */
                         while ( mt->mt_mods != mi ) {                          while ( mt->mt_mods != mi ) {
                                 ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );                                  ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
                                 ldap_pvt_thread_yield();                                  /* FIXME: if dynamic config can delete overlays or
                                    * databases we'll have to check for cleanup here.
                                    * Currently it's not an issue because there are
                                    * no dynamic config deletes...
                                    */
                                   if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
                                           ldap_pvt_thread_yield();
                                 ldap_pvt_thread_mutex_lock( &mt->mt_mutex );                                  ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
   
                                 /* clean up if the caller is giving up */                                  /* clean up if the caller is giving up */
Line 2315  syncprov_operational( Line 2336  syncprov_operational(
         slap_overinst           *on = (slap_overinst *)op->o_bd->bd_info;          slap_overinst           *on = (slap_overinst *)op->o_bd->bd_info;
         syncprov_info_t         *si = (syncprov_info_t *)on->on_bi.bi_private;          syncprov_info_t         *si = (syncprov_info_t *)on->on_bi.bi_private;
   
           /* This prevents generating unnecessarily; frontend will strip
            * any statically stored copy.
            */
           if ( op->o_sync != SLAP_CONTROL_NONE )
                   return SLAP_CB_CONTINUE;
   
         if ( rs->sr_entry &&          if ( rs->sr_entry &&
                 dn_match( &rs->sr_entry->e_nname, op->o_bd->be_nsuffix )) {                  dn_match( &rs->sr_entry->e_nname, op->o_bd->be_nsuffix )) {
   
Line 2412  sp_cf_gen(ConfigArgs *c) Line 2439  sp_cf_gen(ConfigArgs *c)
                 case SP_CHKPT:                  case SP_CHKPT:
                         if ( si->si_chkops || si->si_chktime ) {                          if ( si->si_chkops || si->si_chktime ) {
                                 struct berval bv;                                  struct berval bv;
                                 bv.bv_len = sprintf( c->cr_msg, "%d %d",                                  bv.bv_len = snprintf( c->cr_msg, sizeof( c->cr_msg ),
                                         si->si_chkops, si->si_chktime );                                          "%d %d", si->si_chkops, si->si_chktime );
                                 bv.bv_val = c->cr_msg;                                  if ( bv.bv_len < 0 || bv.bv_len >= sizeof( c->cr_msg ) ) {
                                 value_add_one( &c->rvalue_vals, &bv );                                          rc = 1;
                                   } else {
                                           bv.bv_val = c->cr_msg;
                                           value_add_one( &c->rvalue_vals, &bv );
                                   }
                         } else {                          } else {
                                 rc = 1;                                  rc = 1;
                         }                          }

Removed from v.1.147.2.12  
changed lines
  Added in v.1.219


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