Diff for /servers/slapd/overlays/syncprov.c between versions 1.311 and 1.317

version 1.311, 2010/04/29 13:47:27 version 1.317, 2010/11/21 14:31:38
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.310 2010/04/13 20:18:25 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.316 2010/11/15 14:42:06 rein 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 133  typedef struct syncprov_info_t { Line 133  typedef struct syncprov_info_t {
         int             si_numops;      /* number of ops since last checkpoint */          int             si_numops;      /* number of ops since last checkpoint */
         int             si_nopres;      /* Skip present phase */          int             si_nopres;      /* Skip present phase */
         int             si_usehint;     /* use reload hint */          int             si_usehint;     /* use reload hint */
           int             si_active;      /* True if there are active mods */
         time_t  si_chklast;     /* time of last checkpoint */          time_t  si_chklast;     /* time of last checkpoint */
         Avlnode *si_mods;       /* entries being modified */          Avlnode *si_mods;       /* entries being modified */
         sessionlog      *si_logs;          sessionlog      *si_logs;
Line 1294  syncprov_matchops( Operation *op, opcook Line 1295  syncprov_matchops( Operation *op, opcook
                 }                  }
   
                 if ( fc.fscope ) {                  if ( fc.fscope ) {
                           ldap_pvt_thread_mutex_lock( &ss->s_mutex );
                         op2 = *ss->s_op;                          op2 = *ss->s_op;
                         oh = *op->o_hdr;                          oh = *op->o_hdr;
                         oh.oh_conn = ss->s_op->o_conn;                          oh.oh_conn = ss->s_op->o_conn;
Line 1302  syncprov_matchops( Operation *op, opcook Line 1304  syncprov_matchops( Operation *op, opcook
                         op2.o_hdr = &oh;                          op2.o_hdr = &oh;
                         op2.o_extra = op->o_extra;                          op2.o_extra = op->o_extra;
                         op2.o_callback = NULL;                          op2.o_callback = NULL;
                         rc = test_filter( &op2, e, ss->s_op->ors_filter );                          if (ss->s_flags & PS_FIX_FILTER) {
                                   /* Skip the AND/GE clause that we stuck on in front. We
                                      would lose deletes/mods that happen during the refresh
                                      phase otherwise (ITS#6555) */
                                   op2.ors_filter = ss->s_op->ors_filter->f_and->f_next;
                           }
                           ldap_pvt_thread_mutex_unlock( &ss->s_mutex );
                           rc = test_filter( &op2, e, op2.ors_filter );
                 }                  }
   
                 Debug( LDAP_DEBUG_TRACE, "syncprov_matchops: sid %03x fscope %d rc %d\n",                  Debug( LDAP_DEBUG_TRACE, "syncprov_matchops: sid %03x fscope %d rc %d\n",
Line 1369  syncprov_op_cleanup( Operation *op, Slap Line 1378  syncprov_op_cleanup( Operation *op, Slap
         syncmatches *sm, *snext;          syncmatches *sm, *snext;
         modtarget *mt, mtdummy;          modtarget *mt, mtdummy;
   
           ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
           if ( si->si_active )
                   si->si_active--;
           ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
   
         for (sm = opc->smatches; sm; sm=snext) {          for (sm = opc->smatches; sm; sm=snext) {
                 snext = sm->sm_next;                  snext = sm->sm_next;
                 syncprov_free_syncop( sm->sm_op );                  syncprov_free_syncop( sm->sm_op );
Line 1969  syncprov_op_mod( Operation *op, SlapRepl Line 1983  syncprov_op_mod( Operation *op, SlapRepl
   
         ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
         have_psearches = ( si->si_ops != NULL );          have_psearches = ( si->si_ops != NULL );
           si->si_active++;
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
   
         cbsize = sizeof(slap_callback) + sizeof(opcookie) +          cbsize = sizeof(slap_callback) + sizeof(opcookie) +
Line 2403  syncprov_op_search( Operation *op, SlapR Line 2418  syncprov_op_search( Operation *op, SlapR
                 sop->s_inuse = 1;                  sop->s_inuse = 1;
   
                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );                  ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
                   while ( si->si_active ) {
                           /* Wait for active mods to finish before proceeding, as they
                            * may already have inspected the si_ops list looking for
                            * consumers to replicate the change to.  Using the log
                            * doesn't help, as we may finish playing it before the
                            * active mods gets added to it.
                            */
                           ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
                           if ( slapd_shutdown )
                                   return SLAPD_ABANDON;
                           if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
                                   ldap_pvt_thread_yield();
                           ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
                   }
                 sop->s_next = si->si_ops;                  sop->s_next = si->si_ops;
                 si->si_ops = sop;                  si->si_ops = sop;
                 ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );                  ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
Line 2476  syncprov_op_search( Operation *op, SlapR Line 2505  syncprov_op_search( Operation *op, SlapR
                                         if ( newer < 0 )                                          if ( newer < 0 )
                                                 changed = SS_CHANGED;                                                  changed = SS_CHANGED;
                                         else if ( newer > 0 ) {                                          else if ( newer > 0 ) {
                                         /* our state is older, tell consumer nothing */                                          /* our state is older, complain to consumer */
                                                 rs->sr_err = LDAP_SUCCESS;                                                  rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
                                                   rs->sr_text = "consumer state is newer than provider!";
 bailout:  bailout:
                                                 if ( sop ) {                                                  if ( sop ) {
                                                         syncops **sp = &si->si_ops;                                                          syncops **sp = &si->si_ops;
Line 2598  shortcut: Line 2628  shortcut:
 #endif  #endif
                 ber_dupbv_x( &fava->f_ava->aa_value, &mincsn, op->o_tmpmemctx );                  ber_dupbv_x( &fava->f_ava->aa_value, &mincsn, op->o_tmpmemctx );
                 fava->f_next = op->ors_filter;                  fava->f_next = op->ors_filter;
                   if ( sop )
                           ldap_pvt_thread_mutex_lock( &sop->s_mutex );
                 op->ors_filter = fand;                  op->ors_filter = fand;
                 filter2bv_x( op, op->ors_filter, &op->ors_filterstr );                  filter2bv_x( op, op->ors_filter, &op->ors_filterstr );
                 if ( sop )                  if ( sop ) {
                         sop->s_flags |= PS_FIX_FILTER;                          sop->s_flags |= PS_FIX_FILTER;
                           ldap_pvt_thread_mutex_unlock( &sop->s_mutex );
                   }
         }          }
   
         /* Let our callback add needed info to returned entries */          /* Let our callback add needed info to returned entries */
Line 3007  syncprov_db_close( Line 3041  syncprov_db_close(
 {  {
     slap_overinst   *on = (slap_overinst *) be->bd_info;      slap_overinst   *on = (slap_overinst *) be->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;
   #ifdef SLAP_CONFIG_DELETE
           syncops *so, *sonext;
   #endif /* SLAP_CONFIG_DELETE */
   
         if ( slapMode & SLAP_TOOL_MODE ) {          if ( slapMode & SLAP_TOOL_MODE ) {
                 return 0;                  return 0;
Line 3027  syncprov_db_close( Line 3064  syncprov_db_close(
                 syncprov_checkpoint( op, &rs, on );                  syncprov_checkpoint( op, &rs, on );
         }          }
   
   #ifdef SLAP_CONFIG_DELETE
           ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
           for ( so=si->si_ops, sonext=so;  so; so=sonext  ) {
                   SlapReply rs = {REP_RESULT};
                   rs.sr_err = LDAP_UNAVAILABLE;
                   send_ldap_result( so->s_op, &rs );
                   sonext=so->s_next;
                   syncprov_drop_psearch( so, 0);
           }
           si->si_ops=NULL;
           ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
           overlay_unregister_control( be, LDAP_CONTROL_SYNC );
   #endif /* SLAP_CONFIG_DELETE */
   
     return 0;      return 0;
 }  }
   

Removed from v.1.311  
changed lines
  Added in v.1.317


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