Diff for /servers/slapd/overlays/syncprov.c between versions 1.305 and 1.314

version 1.305, 2009/11/22 16:43:48 version 1.314, 2010/07/01 09:51:43
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.303 2009/11/22 03:42:00 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.313 2010/06/23 14:34:25 ralf 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-2009 The OpenLDAP Foundation.   * Copyright 2004-2010 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 783  syncprov_free_syncop( syncops *so ) Line 783  syncprov_free_syncop( syncops *so )
         GroupAssertion *ga, *gnext;          GroupAssertion *ga, *gnext;
   
         ldap_pvt_thread_mutex_lock( &so->s_mutex );          ldap_pvt_thread_mutex_lock( &so->s_mutex );
         if ( --so->s_inuse > 0 ) {          /* already being freed, or still in use */
           if ( !so->s_inuse || --so->s_inuse > 0 ) {
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  ldap_pvt_thread_mutex_unlock( &so->s_mutex );
                 return;                  return;
         }          }
Line 931  syncprov_qplay( Operation *op, syncops * Line 932  syncprov_qplay( Operation *op, syncops *
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  ldap_pvt_thread_mutex_unlock( &so->s_mutex );
   
                 if ( sr->s_mode == LDAP_SYNC_NEW_COOKIE ) {                  if ( sr->s_mode == LDAP_SYNC_NEW_COOKIE ) {
                     SlapReply rs = { REP_INTERMEDIATE };                          SlapReply rs = { REP_INTERMEDIATE };
   
                     rc = syncprov_sendinfo( op, &rs, LDAP_TAG_SYNC_NEW_COOKIE,                          rc = syncprov_sendinfo( op, &rs, LDAP_TAG_SYNC_NEW_COOKIE,
                                 &sr->s_csn, 0, NULL, 0 );                                  &sr->s_csn, 0, NULL, 0 );
                 } else {                  } else {
                         opc.sdn = sr->s_dn;                          opc.sdn = sr->s_dn;
Line 945  syncprov_qplay( Operation *op, syncops * Line 946  syncprov_qplay( Operation *op, syncops *
   
                         rc = syncprov_sendresp( op, &opc, so, sr->s_mode );                          rc = syncprov_sendresp( op, &opc, so, sr->s_mode );
   
                         if ( opc.se ) {                  }
                                 if ( !dec_mutexint( opc.se->e_private )) {                  if ( sr->s_e ) {
                                         opc.se->e_private = NULL;                          if ( !dec_mutexint( sr->s_e->e_private )) {
                                         entry_free ( opc.se );                                  sr->s_e->e_private = NULL;
                                 }                                  entry_free ( sr->s_e );
                         }                          }
                 }                  }
   
Line 1301  syncprov_matchops( Operation *op, opcook Line 1302  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 );                          ldap_pvt_thread_mutex_lock( &ss->s_mutex );
                           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 1413  syncprov_checkpoint( Operation *op, Slap Line 1422  syncprov_checkpoint( Operation *op, Slap
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
         slap_callback cb = {0};          slap_callback cb = {0};
         BackendDB be;          BackendDB be;
           BackendInfo *bi;
   
 #ifdef CHECK_CSN  #ifdef CHECK_CSN
         Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;          Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
Line 1442  syncprov_checkpoint( Operation *op, Slap Line 1452  syncprov_checkpoint( Operation *op, Slap
         }          }
         opm.o_req_dn = si->si_contextdn;          opm.o_req_dn = si->si_contextdn;
         opm.o_req_ndn = si->si_contextdn;          opm.o_req_ndn = si->si_contextdn;
           bi = opm.o_bd->bd_info;
         opm.o_bd->bd_info = on->on_info->oi_orig;          opm.o_bd->bd_info = on->on_info->oi_orig;
         opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;          opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;
         opm.o_no_schema_check = 1;          opm.o_no_schema_check = 1;
Line 1459  syncprov_checkpoint( Operation *op, Slap Line 1470  syncprov_checkpoint( Operation *op, Slap
                 if ( e == opm.ora_e )                  if ( e == opm.ora_e )
                         be_entry_release_w( &opm, opm.ora_e );                          be_entry_release_w( &opm, opm.ora_e );
         }          }
           opm.o_bd->bd_info = bi;
   
         if ( mod.sml_next != NULL ) {          if ( mod.sml_next != NULL ) {
                 slap_mods_free( mod.sml_next, 1 );                  slap_mods_free( mod.sml_next, 1 );
Line 2473  syncprov_op_search( Operation *op, SlapR Line 2485  syncprov_op_search( Operation *op, SlapR
                                                 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, tell consumer nothing */
                                                   rs->sr_err = LDAP_SUCCESS;
   bailout:
                                                 if ( sop ) {                                                  if ( sop ) {
                                                         syncops **sp = &si->si_ops;                                                          syncops **sp = &si->si_ops;
                                                                                                                   
Line 2483  syncprov_op_search( Operation *op, SlapR Line 2497  syncprov_op_search( Operation *op, SlapR
                                                         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );                                                          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
                                                         ch_free( sop );                                                          ch_free( sop );
                                                 }                                                  }
                                                 rs->sr_err = LDAP_SUCCESS;  
                                                 rs->sr_ctrls = NULL;                                                  rs->sr_ctrls = NULL;
                                                 send_ldap_result( op, rs );                                                  send_ldap_result( op, rs );
                                                 return rs->sr_err;                                                  return rs->sr_err;
Line 2538  no_change:  if ( !(op->o_sync_mode & SLA Line 2551  no_change:  if ( !(op->o_sync_mode & SLA
                                         ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );                                          ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 if ( sids )                                  if ( sids )
                                         op->o_tmpfree( sids, op->o_tmpmemctx );                                          op->o_tmpfree( sids, op->o_tmpmemctx );
                                 send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );                                  rs->sr_err = LDAP_SYNC_REFRESH_REQUIRED;
                                 return rs->sr_err;                                  rs->sr_text = "sync cookie is stale";
                                   goto bailout;
                         }                          }
                         if ( srs->sr_state.ctxcsn ) {                          if ( srs->sr_state.ctxcsn ) {
                                 ber_bvarray_free_x( srs->sr_state.ctxcsn, op->o_tmpmemctx );                                  ber_bvarray_free_x( srs->sr_state.ctxcsn, op->o_tmpmemctx );
Line 2559  no_change:  if ( !(op->o_sync_mode & SLA Line 2573  no_change:  if ( !(op->o_sync_mode & SLA
                                         ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );                                          ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 if ( sids )                                  if ( sids )
                                         op->o_tmpfree( sids, op->o_tmpmemctx );                                          op->o_tmpfree( sids, op->o_tmpmemctx );
                                 send_ldap_result( op, rs );                                  goto bailout;
                                 return rs->sr_err;  
                         }                          }
                 }                  }
         } else {          } else {
Line 3002  syncprov_db_close( Line 3015  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 3022  syncprov_db_close( Line 3038  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.305  
changed lines
  Added in v.1.314


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